2009-02-02 88 views
-1

所以...... 當我去:爲什麼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

回答

9

快速測試用下面的代碼:

#include <string> 
#include <iostream> 

using namespace std; 

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

產生NT的一個實例,所以它看起來就像你可能有另一個輸出通話地方。

1

這不是c_str()的問題,但可能與其他程序中的其他異常有關。

製作一個「hello world」應用程序,可以執行相同的操作,並且您會發現它在那裏可以正常工作。

2

顯示更多的代碼。這似乎是你做了cout << ealier,並忘記了你做到了。它是什麼打印cout<< "mofo" << stringName.c_str()<< "|||" << endl;是不是說NTmofoNT|||?如果使可能是發生了什麼事;)

4

傳統的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")