我有一个我想要打印的字符串。当我使用cout
时,它输出完美,但使用printf
会使其失效。
以下是代码:
int main ( int argc, char *argv[] )
{
// Check to make sure there is a single argument
if ( argc != 2 )
{
cout<<"usage: "<< argv[0] <<" <filename>\n";
return 1;
}
// Grab the filename and remove the extension
std::string filename(argv[1]);
int lastindex = filename.find_last_of(".");
std::string rawname = filename.substr(0, lastindex);
cout << "rawname:" << rawname << endl;
printf("rawname: %s", rawname);
}
cout
给我“rawname:file”
printf
给了我“rawname:”然后给了我一堆波浪形的字符
答案 0 :(得分:20)
因为rawname被定义为std :: string。你需要使用
printf("rawname: %s", rawname.c_str());
原因是带有%s的printf期望内存中有一个空终止的C字符串。而std :: string stl字符串并不完全是原始的 - 它最终会在你的情况下终止,不确定这是否是一种保证,因为长度由stl容器类内部管理。
修改强>
正如评论中指出的那样,内部保证无效终止。所以你所看到的'波浪线'是该字符串中所有已分配但未被利用(或初始化)的内存的输出,直到空终止符。
答案 1 :(得分:15)
答案 2 :(得分:5)
您需要打印std :: string的内部char *:
printf("rawname: %s", rawname.c_str());
答案 3 :(得分:3)
试试这个
cout << "rawname:" << rawname << endl;
printf("rawname: %s", rawname.c_str());
rawname不是char数组,而是std :: string类的实例。要获取实际的char数组,您应该调用c_str()函数
答案 4 :(得分:2)
你在printf中尝试过rawname.c_str()吗?