0

次のリストを含む .DAT ファイルを読み取るプログラムがあります。

removepeer 452
addpeer 6576
removepeer 54245

ある時点で、くだらないテキストを読み上げます: H�</p>

これが私のコードの一部です。

getline(abc, info, '\n'); //data here displays pretty fine

int count = info.size();

char text[count];

for(int a=0; a<count; a++){
    text[a] = data[a];
}
cout << text << endl; //Some rubbish text found in some printout!

最後の行に続いてゴミのテキストが出力されます

4

1 に答える 1

4

text配列はnullで終了しません。これは、withを使用する場合に必要です。これは、operator<<nullchar[]で終了するcスタイルの文字列として扱われるためです。メモリからのランダムな文字は、ヌルターミネータが偶然に見つかるまで書き込まれます。技術的には、配列の境界を超えてアクセスすることは未定義の動作です。

修正するには、ヌルターミネータをに追加しますtext。コンパイラには可変長配列(標準のC ++ではありませんが、C99にあります)の拡張機能があるため、次のように変更できます。

char text[count + 1];

// snip...

text[count] = 0;

そうは言っても、なぜstd::stringインスタンスからにコピーしているのかわかりませんchar[]std::stringインスタンスは、を使用してストリームに書き込まれることもありますoperator<<

于 2013-02-05T13:03:31.027 に答える