所以......当我去的时候:
cout<<stringName<<endl;
我得到:
NT
但是当我去的时候:
cout<<stringName.c_str()<<endl;
我得到:
NTNT
为什么?
使用以下代码进行快速测试:
#include <string>
#include <iostream>
using namespace std;
int main(void) {
string str = "NT";
cout << str.c_str() << endl;
return 0;
}
产生一个 NT 实例,所以看起来你可能在某处有另一个输出调用。
一个传统的 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")
显示更多代码。好像你做到cout << ealier
了,却忘记了你做到了。如果你这样做它会打印什么 cout<< "mofo" << stringName.c_str()<< "|||" << endl;
它说NTmofoNT|||
吗?如果是这样,那很可能就是发生了什么;)
这不是问题c_str()
,但可能与程序其余部分中的一些其他异常有关。
制作一个执行这些相同操作的“hello world”应用程序,您会发现它在那里运行良好。