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

9

我是一个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;
}

3
请使用 C++ 中的 cout 命令。如果要使用 printf 命令并且需要输出字符串 %s,则需要使用 p.first_name.c_str()。但在 C++ 中请勿使用 printf 命令。 - David Heffernan
6个回答

13
问题在于printf/scanf不是类型安全的。你给printf提供了一个std::string对象,但它期望得到的是一个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。C++ 中是否有类似于 printf 的格式化函数? - BuddyJoe

4

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

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

此外,由于你正在使用C++,你应该学习cout而不是printf!

回答问题并引导他朝正确的方向前进是一个好习惯。 - Lou

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

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

然而,如果您正在使用C ++,为什么不使用iostream呢?


+1 因为我是个新手。我正在翻阅我的 C++ 书籍。 - BuddyJoe
因为相比于printf(),iostream非常非常非常慢。它做了很多你不需要的事情。Google! - Notinlist

2
您不能将C++的std::string对象传递给printf。printf只能识别原始类型,如int、float和char*。您的编译器应该在此处给您一个警告;如果没有,请提高警告级别。
既然您正在使用C ++,那么文本输出应该使用std :: cout,并且它确实可以理解std :: string对象。如果您真的必须出于某种原因使用printf,则可以通过调用其上的c_str()方法将std :: string转换为const char *。

0

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

std::cout << p.first_name;

好的,你演示了如何输出名字。那么“Hello”这个单词呢? - Jim Rhodes
@Jim,对于“Hello”,OP已经用printf正确解决了。你应该尝试识别问题的主要部分,忽略其他琐碎的部分。是吗? - Eric Z

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接