-1

所以......当我去的时候:

cout<<stringName<<endl;

我得到:

NT

但是当我去的时候:

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

我得到:

NTNT

为什么?

4

4 回答 4

9

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

#include <string>
#include <iostream>

using namespace std;

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

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

于 2009-02-02T23:59:21.890 回答
4

一个传统的 C 字符串(通过 a 访问char const*)有一个以字符 0 结尾的字符序列。(不是数字0,而是一个实际的零值,我们写为'\0'。)没有明确的长度——所以各种字符串操作只读取一个字符一次,直到它击中'\0'.

C++std::string在其结构中具有明确的长度。

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

'NTNT\0'

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

这将导致这种行为——std::string直接操作 将表现为它只有两个字符长,但如果你使用 进行传统的 C 操作s.c_str(),它看起来像"NTNT".

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

进入这种状态的一种方法是实际写入字符串的字符,例如:strcat((char *)s.c_str(), "NT")

于 2009-02-03T18:46:36.750 回答
2

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

于 2009-02-02T23:46:59.077 回答
1

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

制作一个执行这些相同操作的“hello world”应用程序,您会发现它在那里运行良好。

于 2009-02-02T23:46:51.620 回答