使用printf和cout获得不同的输出 - C ++

时间:2011-06-21 01:01:09

标签: c++ string printf

我有一个我想要打印的字符串。当我使用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:”然后给了我一堆波浪形的字符

5 个答案:

答案 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()吗?