2

私はソフトウェア エンジニアリングの学生で、次の学期に向けて改善するためにクリスマス休暇を取っています。さまざまなコンソール アプリケーションを作成して練習しています。しかし、問題が発生しました。ユーザーから整数入力を取得する必要があります。私はfgets文字列を取得するためにstdin使用してから整数を取得するために使用sscanfしました(これは正常に機能しました)が、ユーザーがバッファサイズを超えて入力すると、末尾の文字がストリームに残ります(改行を含めると、次の呼び出しがスキップされますfgets)。私が周りを見回したところ、while(getchar() != '\n');消費される改行文字がない場合、入力の不要なスキャンが行われるため、ほとんどの人がそれを示唆しているように見えますが、問題が発生することがわかりました。

例:

int ch;
char* buffer = (char*)malloc(BUFSIZ*sizeof(char));
while((ch = getchar()) != '\n' && ch != EOF);
fgets(buffer,BUFSIZ*sizeof(char),stdin);

バッファーが小さすぎず、ストリームに末尾の文字が残っていない場合は、不必要なgetchar()原因となる入力があります。

出力:

A

A

You typed A

Intended Output:

A

You typed A

これが十分に明確になったことを願っています。助けていただければ幸いです。

4

1 に答える 1

6

読み取った文字列に改行が含まれているかどうかを確認してください。

  • 改行がある場合は、入力をクリアする必要はありません。
  • 改行がない場合は、改行が見つかるまで読んでください。

Unixでは、このループは妥当です。

int c;
while ((c = getchar()) != EOF && c != '\n')
    ;

引用したものと比較したEOFテストに注意してください(質問のテキストで。これはコードスニペットで引用したものですが、ここでは2行にまたがっており、一般的に読みやすくなっています)。私はこの「ゴブリング」をfgets()次の前ではなく、の後に行います。

Microsoftのコンパイラとライブラリを備えたWindowsでは、fflush(stdin)気になっている場合は試してみることができます。これで動作が文書化されています(MSDN Webサイトを参照)。Unixでは、試行fflush(stdin)すると未定義の動作が発生します—実行しないでください。

于 2012-12-20T23:06:22.247 に答える