为什么c_str()会打印两次字符串?
问题描述:
所以...... 当我去:为什么c_str()会打印两次字符串?
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_str()
的问题,但可能与其他程序中的其他异常有关。
制作一个“hello world”应用程序,可以执行相同的操作,并且您会发现它在那里可以正常工作。
答
显示更多的代码。这似乎是你做了cout << ealier
,并忘记了你做到了。它是什么打印cout<< "mofo" << stringName.c_str()<< "|||" << endl;
是不是说NTmofoNT|||
?如果使可能是发生了什么事;)
答
传统的C字符串(通过char const*
访问)具有由字符0终止的字符序列(而不是数字0
,但实际的零值,这是我们写出作为'\0'
。)有没有明确的长度—所以各种字符串操作一次只读取一个字符,直到它遇到'\0'
。
C++ std::string
在其结构中具有明确的长度。
有没有可能是你的字符串的字符内存布局是这样的:
'NTNT\0'
但是字符串的长度设置为2?
这将导致正是这种行为—操纵std::string
直接将像它只是两个字符长,但如果你使用s.c_str()
传统的C操作,它看起来就像"NTNT"
。
我不知道什么shenanigans会让你进入这种状态,但它肯定会符合症状。你可以进入这个状态
一种方法是实际写字符串的字符,是这样的:strcat((char *)s.c_str(), "NT")
是否使用wstring的任何机会。 – 2009-02-02 23:45:25
甚至不知道那是什么。 – Alex 2009-02-02 23:46:11
你正在做什么fork()在附近 - 也许你有多个进程冲洗或多或少相同的缓冲区。 – 2009-02-03 00:04:17