当我将std :: string传递给printf时,为什么会出现异常?

时间:2013-08-12 18:39:24

标签: c++ string printf

#include<iostream>
#include<string.h>
#include<stdio.h>

using namespace std;

int main()
{
    char a[10] = "asd asd";
    char b[10] ="bsd bsd";
    string str(a);
    str.append(b);
    printf("\n--------%s--------\n", str);
    return 0;
}

我无法理解为什么会产生异常?该程序主要尝试追加字符串。我在使用std::cout时获得了所需的输出,但在使用printf时却没有。

4 个答案:

答案 0 :(得分:4)

因为std::stringchar const *不同,这是%s格式指定的内容。您需要使用c_str()方法返回printf()所需的指针:

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

为了更具技术性,printf()是从C世界导入的函数,它需要一个“C风格的字符串”(指向由空字符终止的字符序列的指针)。 std::string::c_str()返回这样的指针,以便C ++字符串可以与现有的C函数一起使用。

答案 1 :(得分:1)

c_str()。必须使用此函数使用样式字符串..

答案 2 :(得分:1)

printf()处理c字符串(char *),你使用的是c ++样式的字符串,因此需要在它们之间进行转换。

只需使用c_str()方法,如此

printf("%s", str.c_str());

答案 3 :(得分:0)

printf s %s格式说明符期望C样式字符串不是std::string,因此您需要使用返回const char*的{​​{3}}:< / p>

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

基本上你有c_str(),因为printf会尝试访问你的参数,好像它是一个指向空终止的C样式字符串的指针。虽然,因为这是C ++,所以你应该使用std::cout更安全。