-1

だから...私が行くとき:

cout<<stringName<<endl;

私は得る:

NT

しかし、私が行くとき:

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

私は得る:

NTNT

なんで?

4

4 に答える 4

9

次のコードを使用した簡単なテスト:

#include <string>
#include <iostream>

using namespace std;

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

NT の 1 つのインスタンスを生成するため、おそらく別の出力呼び出しがどこかにあるように見えます。

于 2009-02-02T23:59:21.890 に答える
4

従来の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")

于 2009-02-03T18:46:36.750 に答える
2

さらにコードを表示します。あなたがやったようで、やったcout << ealierのを忘れてしまったようです。すると何を 出力しcout<< "mofo" << stringName.c_str()<< "|||" << endl;ますかNTmofoNT|||?もしそうなら、それが起こったことかもしれません;)

于 2009-02-02T23:46:59.077 に答える
1

これは の問題ではありませんc_str()が、プログラムの残りの部分にある他の異常に関連している可能性があります。

これらと同じ操作を行う「hello world」アプリケーションを作成すると、そこで正常に動作することがわかります。

于 2009-02-02T23:46:51.620 に答える