所以... 我走的时候:
cout<<stringName<<endl;
我明白了:
NT
但是当我走的时候:
cout<<stringName.c_str()<<endl;
我明白了:
NTNT
为什么?
答案 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”应用程序,你会发现它在那里工作正常。