1

テキストファイルから80文字を読み取り、それらを文字列に保存してから、検証のためにその文字列を印刷したいと思います。私はfreadを使用していて、次のコードを持っています:

char message[80];
size_t nread = fread(message, 1, sizeof(message), fp);
printf("Message received: \"__%s__\"\n", message);

そして、出力は次のとおりです。

受信したメッセージ:「__私は世界を変えたいのですが、彼らは
��__しません」

フレーズ全体がファイルにない場合

と:

__世界を変えたいのですが、ソースコードを教えてくれません
@__

フレーズ全体がファイルにある場合。

削除してテキストを書き直してみましたが、同じ出力が返されます。

なにが問題ですか?文字セットで何か?

4

1 に答える 1

6

fread()バッファをnullで終了せずprinf("%s")、バッファがnullで終了することを期待します。バッファはnullで終了していないためprintf()、nullターミネータが見つかるまで読み取りを続行し、途中でジャンクを出力します。

nullターミネータ用のスペースを残すことを忘れずに、バッファをnullで終了します。

char message[81]; /* Increased by 1 for null terminator. */
size_t nread = fread(message, 1, sizeof(message) - 1, fp);
message[nread] = 0;
printf("Message received: \"__%s__\"\n", message);

または、フォーマット指定子printf()を使用して読み取られた文字数のみを出力するように指示します。"%.*s"

printf("Message received: \"__%.*s__\"\n", nread, message);
于 2012-12-12T10:39:44.107 に答える