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

问题描述:

所以...... 当我去:为什么c_str()会打印两次字符串?

cout<<stringName<<endl; 

我得到:

NT 

但是,当我去:

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

我得到:

NTNT 

为什么?

+0

是否使用wstring的任何机会。 – 2009-02-02 23:45:25

+0

甚至不知道那是什么。 – Alex 2009-02-02 23:46:11

+0

你正在做什么fork()在附近 - 也许你有多个进程冲洗或多或少相同的缓冲区。 – 2009-02-03 00:04:17

快速测试用下面的代码:

#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")