だから...私が行くとき:
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 の 1 つのインスタンスを生成するため、おそらく別の出力呼び出しがどこかにあるように見えます。
従来のC文字列(からアクセスchar const*
)には、文字0で終わる文字のシーケンスがあります(数字0
ではなく、実際のゼロ値として記述し'\0'
ます)。明示的な長さはないため、さまざまな文字列操作で1文字が読み取られます。に当たるまで一度に'\0'
。
C ++std::string
の構造には、明示的な長さがあります。
文字列の文字のメモリレイアウトが次のようになっている可能性はありますか?
'NTNT\0'
しかし、文字列の長さは2に設定されていますか?
その結果、まさにこの動作になります。std::string
直接操作すると、2文字の長さのように動作しますが、を使用して従来のC操作を実行するs.c_str()
と、のようになります"NTNT"
。
どのシェナニガンがあなたをこの状態にするかはわかりませんが、それは確かに症状と一致します。
この状態に入る1つの方法は、実際に文字列の文字に次のように書き込むことです。strcat((char *)s.c_str(), "NT")
さらにコードを表示します。あなたがやったようで、やったcout << ealier
のを忘れてしまったようです。すると何を 出力しcout<< "mofo" << stringName.c_str()<< "|||" << endl;
ますかNTmofoNT|||
?もしそうなら、それが起こったことかもしれません;)
これは の問題ではありませんc_str()
が、プログラムの残りの部分にある他の異常に関連している可能性があります。
これらと同じ操作を行う「hello world」アプリケーションを作成すると、そこで正常に動作することがわかります。