所以...... 當我去:爲什麼c_str()會打印兩次字符串?
cout<<stringName<<endl;
我得到:
NT
但是,當我去:
cout<<stringName.c_str()<<endl;
我得到:
NTNT
爲什麼?
所以...... 當我去:爲什麼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