C++ и printf-вывод странных символов
Я полный новичок в C++, но не в Java, C#, JavaScript, VB. Я работаю с консольным приложением C++ по умолчанию из Visual Studio 2010.
при попытке сделать printf я получаю некоторые странные символы. Не то же самое каждый раз, когда говорит мне, что они могут смотреть на разные места памяти каждый раз, когда я запускаю его.
код:
#include "stdafx.h"
#include <string>
using namespace std;
class Person
{
public:
string first_name;
};
int _tmain(int argc, _TCHAR* argv[])
{
char somechar;
Person p;
p.first_name = "Bruno";
printf("Hello %s", p.first_name);
scanf("%c",&somechar);
return 0;
}
6 ответов
проблема в том, что printf
/scanf
не являются typesafe. Вы поставляете std::string
объект, где printf
ждет const char*
.
один из способов исправить это-пишите
printf("Hello %s", p.first_name.c_str());
однако, поскольку вы кодируете на C++, рекомендуется использовать потоки ввода-вывода вместо printf
/scanf
:
std::cout << p.first_name << std::endl;
std::cin >> c;
преобразовать строку в c-строку.
printf("Hello %s", p.first_name.c_str());
кроме того, поскольку вы используете C++, вы должны узнать о cout в отличие от printf!
printf("Hello %s", p.first_name.c_str());
однако, почему вы не используете iostream, если вы используете c++?
вы не можете передать C++ std::string
объекты printf
. printf
понимает только примитивные типы, такие как int
, float
и char*
. Ваш компилятор должны будет давать вам предупреждение там; если это не так, поднимите уровень предупреждения.
поскольку вы используете c++, вы действительно должны использовать std::cout
для вывода текста, и это понимает std::string
объекты. Если вам действительно нужно использовать printf
по какой-то причине, затем преобразуйте std::string
до const char*
by вызываю c_str()
метод.
printf("%s")
принимает строку в стиле c, которая завершается ''
. Однако,string
object-это объект C++, который отличается от строки c-стиля. Вы должны использовать std::cout
который перегружен для обработки string
введите непосредственно, как показано ниже.
std::cout << p.first_name;