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());!


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;