1

fgets() を使用してユーザー入力を取得し、sscanf() を使用して double に解析します。これが私のコード例です:

int menuItem = 0;
char input[3];
printf("Enter valid menu item"); //values are 1, 2, 3, 4, 5, and -1
fgets(input, sizeof input, stdin);
sscanf(input, "%d", &menuItem);

ユーザーが 3 桁を入力するとエラーが発生し (無効な入力であり、それに応じて処理したい)、3 桁目を次の入力として自動的に配置することにより、次の fgets() をスキップします。たとえば、ユーザーが 123 を入力すると、次の fgets をスキップし、値 3 を入力として使用します。どうすればこれをクリアできますか、またはせいぜい1桁しか読み取れません(ただし、-1を処理できます)。

4

2 に答える 2

3

入力配列を大きくしてみませんか?50バイトのように...ユーザーがそれほど多く入力すると、彼らはばかであり、奇妙な動作に値します=)

これはもちろん洗練されていませんが、大局的に見ると、おそらくここで非常に強力なコードを書いているわけではありません。ばかげたバグを修正したいだけで、これが最も簡単な解決策です。

[編集]

なぜ私がこれを提案したのか混乱している場合。入力配列は、2 つの値と null ターミネータを保持するのに十分な大きさしかありません。したがって、明らかに、ユーザーが 2 つの選択肢ではなく 1 つの選択肢を入力したことを確認できるように、十分な大きさにする必要があります。

于 2012-09-09T23:30:15.020 に答える
2

入力バッファでは、1 つの数字、1 つの改行、および 1 つの端末 null が許可されます'\0'が、これは実際には十分な大きさではありません。

ユーザーのタイプの100後に改行が続くとします。への最初の呼び出しでfgets()は 2 桁 ( 10) が読み取られ、2 回目の呼び出しでは 3 桁目と改行が読み取られます。その後、次の呼び出しは次の入力を待ちます。

バッファサイズをより賢明なものに増やすだけです。私が作成する多くのプログラムでは、4096 のバッファー サイズを使用します。POSIX 標準では、_POSIX2_LINE_MAX を 2048 に設定しています。これが気に入らない場合は、単純に 64 や 128 などの便利な数値を使用してください。あなたはあまりにも間違って行くことはありません。

fgets()andを使用した手法sscanf()は間違いなくより良い方向ですがsscanf()、正しい数の値が解析されたことを確認する必要があります。fgets()plusの利点の 1 つはsscanf()、ユーザーが入力した行の何が間違っていたかについて、より適切なレポートを作成できることです。fscanf()orscanf()を直接使用する場合、これを行うのははるかに簡単ではありません。

于 2012-09-10T00:05:46.013 に答える