C ++和printf - 奇怪的字符输出

时间:2011-10-14 15:12:38

标签: c++ console-application printf

我是C ++的完全新手,但不是Java,C#,JavaScript,VB。我正在使用Visual Studio 2010中的默认C ++控制台应用程序。

在尝试做一个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 个答案:

答案 0 :(得分:10)

问题是printf / scanf不是类型安全的。您提供的std::string对象printf期望const char*

解决此问题的一种方法是编写

printf("Hello %s", p.first_name.c_str());

但是,由于您使用C ++进行编码,因此优先使用I / O流而不是printf / scanf

std::cout << p.first_name << std::endl;
std::cin >> c;

答案 1 :(得分:4)

将字符串转换为c字符串。

printf("Hello %s", p.first_name.c_str()); 

此外,由于您使用的是C ++,因此您应该了解cout而不是printf!

答案 2 :(得分:2)

使用printf("Hello %s",p.first_name.c_str());

答案 3 :(得分:2)

printf("Hello %s", p.first_name.c_str());

但是,如果您使用的是c ++,为什么不使用iostream?

答案 4 :(得分:2)

您无法将C ++ std::string个对象传递到printfprintf仅了解intfloatchar*等原始类型。你的编译器在那里给你一个警告;如果不是,请提高你的警告水平。

由于您使用的是C ++,因此您应该使用std::cout进行文本输出,这样可以理解std::string个对象。如果您出于某种原因确实必须使用printf,请通过调用std::string方法将const char*转换为c_str()

答案 5 :(得分:0)

printf("%s")接受由'\0'终止的c样式字符串。但是,string对象是C ++对象,它与c风格的字符串不同。您应该使用重载的std::cout直接处理string类型,如下所示。

std::cout << p.first_name;