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

C++ and printf - strange character output

本文关键字:字符 输出 printf- C++      更新时间:2023-10-16

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

在尝试打印时,我遇到了一些奇怪的角色。每次都不一样,告诉我,每次我运行它时,他们可能会看到不同的内存位置

代码:

#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;
}

问题是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;

将字符串转换为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());

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

不能将C++std::string对象传递到printf中。printf只理解像intfloatchar*这样的基元类型。您的编译器应该在那里向您发出警告;如果不是,提高你的警告级别。

既然您使用的是C++,那么您实际上应该使用std::cout进行文本输出,这确实理解了std::string对象。如果出于某种原因确实必须使用printf,那么通过调用c_str()方法将std::string转换为const char*

printf("%s")接受以''结尾的c样式字符串。然而,string对象是C++对象,它不同于C风格的字符串。您应该使用重载的std::cout来直接处理string类型,如下所示。

std::cout << p.first_name;