得到<null>使用printf与字符串</null>

时间:2012-03-29 07:51:01

标签: c++ printf

当使用printf作为字符串时,我得到了:

string key = "123";
printf("Value is %s \n", key);
  

//输出为:值为&lt; null&gt;

但如果我这样做:

string key = "123";
printf("Value is: ");
printf(key.c_str());

然后我得到:

  

//输出为:值为123

所以我做错了

  

printf%s

提前致谢。

6 个答案:

答案 0 :(得分:4)

std::string是一个C ++类。所以这不起作用,因为:

  1. printf是一个纯C函数,它只知道如何处理基本类型(intdoublechar *等。)。
  2. printfvariadic function。将类类型传递给可变参数函数会导致未定义的行为 1
  3. 如果要显示字符串,请使用std::cout

    std::cout << key << "\n";
    

    如果你只是必须使用printf,那么这应该有效:

    printf("%s\n", key.c_str());
    

    c_str是一个成员函数,它返回一个C风格的字符串(即const char *)。请记住它有一些限制;您无法修改或删除调用string之间的c_str()对象并使用结果:

    const char *p = key.c_str();
    key = "something else";
    printf("%s\n", p);  // Undefined behaviour
    

    <小时/> <子> 1。或者可能实现定义的,我不记得了。无论哪种方式,它都不会很好地结束。

答案 1 :(得分:3)

令牌%s告诉printf期望空终止const char*,并且您传递std::string

正确的方法是:

printf("Value is %s \n", key.c_str());

C ++的方式是使用std::cout

答案 2 :(得分:2)

printf是C库函数,需要%s格式的C“string”(char *)。您已经发现,您可以执行cppstring.c_str()来获取此信息。 另请参阅this question

答案 3 :(得分:2)

C风格将是

printf("Value is %s \n", key.c_str()); // printf does need a nullterminated char*

C ++风格将是

cout << "Value is %s " << key << endl; // cout can use std::string directly

答案 4 :(得分:1)

除了其他答案之外:printf是一个可变参数函数,并且传递一个不是POD的类类型的对象是未定义的行为,而std::string是一个不是a的类类型荚。当然,未定义的行为意味着任何事情都可能发生,但是这个很容易被发现,一个好的编译器至少会警告错误。

答案 5 :(得分:0)

COUT&LT;&LT;字符串可以工作是String类的bacasue已经重载了运算符“&lt;&lt;”,所以printf()肯定无法工作!