当使用printf作为字符串时,我得到了:
string key = "123";
printf("Value is %s \n", key);
//输出为:值为< null>
但如果我这样做:
string key = "123";
printf("Value is: ");
printf(key.c_str());
然后我得到:
//输出为:值为123
所以我做错了
printf%s
提前致谢。
答案 0 :(得分:4)
std::string
是一个C ++类。所以这不起作用,因为:
printf
是一个纯C函数,它只知道如何处理基本类型(int
,double
,char *
等。)。printf
是variadic function。将类类型传递给可变参数函数会导致未定义的行为。 1 如果要显示字符串,请使用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()肯定无法工作!