为什么c_str()会打印两次字符串?

时间:2009-02-02 23:43:47

标签: c++ c-strings

所以... 我走的时候:

cout<<stringName<<endl;

我明白了:

NT

但是当我走的时候:

cout<<stringName.c_str()<<endl;

我明白了:

NTNT

为什么?

4 个答案:

答案 0 :(得分:9)

使用以下代码进行快速测试:

#include <string>
#include <iostream>

using namespace std;

int main(void) {
    string str = "NT";
    cout << str.c_str() << endl;
    return 0;
}

生成NT的一个实例,所以看起来你可能在某个地方有另一个输出调用。

答案 1 :(得分:4)

传统的C字符串(通过char const*访问)具有由字符0终止的字符序列。(不是数字0,而是实际的零值,我们将其写为{{ 1}}。)没有明确的长度 - 所以各种字符串操作一次只能读取一个字符,直到它到达'\0'

C ++ '\0'在结构上有明确的长度。

字符串字符的内存布局是否可能如下所示:

std::string

但字符串的长度设置为2?

这会导致这种行为 - 直接操纵'NTNT\0' 会使它只有两个字符长,但如果使用std::string进行传统的C操作,它将看起来像{{1} }。

我不确定什么恶作剧会让你进入这种状态,但它肯定会与症状相符。

你可以进入这种状态的一种方法是实际到字符串的字符,例如:s.c_str()

答案 2 :(得分:2)

显示更多代码。好像你做过cout << ealier而忘了你做到了。如果你做cout<< "mofo" << stringName.c_str()<< "|||" << endl;,它会打印什么表明NTmofoNT|||?如果是这样,很可能发生了什么;)

答案 3 :(得分:1)

这不是c_str()的问题,但可能与其他程序中的其他一些异常有关。

创建一个执行相同操作的“hello world”应用程序,你会发现它在那里工作正常。