6

宿題の一環として、標準入力から単一の文字を読み取り、それに従って行動しようとしています:

char choice;

while (1) {
    printf("please enter [y]es, [n]o or [m]aybe: ");
    scanf("%c", choice);
    fflush(stdin);
    // validate input
    if (choice == 'y' || choice == 'n' || choice == 'm') {
        break;
    } else {
      printf("Please enter only \'y\', \'n\' or \'m\'!\n");
    }
}
// do something with the input
if (choice == 'y') {
    printf("you selected yes!\n");
}

何らかの理由で、scanf は後に文字と改行の両方をキャプチャするため、入力に対して何かを実行し、「'y'、'n'、または 'm' のみを入力してください!」も出力します。ライン。標準入力に複数の文字を入力すると、最初の文字も正しく実行しながら、そのすべての行が出力されます。たとえば、次のようになります。

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
$ ./run
please enter [y]es, [n]o or [m]aybe: yes<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
Please enter only 'y', 'n' or 'm'!
$

getchar を使用しても同じことが起こります。私は何が欠けていますか?ありがとう。

4

4 に答える 4

12

正しく機能させるにscanf("は、 と の間にスペースが必要です。%c

scanf(" %c", &choice);

また、choice ではなく &choice を使用する必要があります。

編集:あなたがそれに取り組んでいる間do while()、そのループを調べたいと思うかもしれません(教授が a を使用するように特に言わない限りbreak)-do whileユーザー入力を検証するときにうまく機能します!

于 2009-12-24T18:08:27.060 に答える
5

fflush()入力ストリームの ISO C では定義されていません。これは Microsoft の C ランタイム ライブラリで定義されていますが、移植できません。

「%c の前のスペース」ソリューションは、ユーザーが期待されるデータを入力するときに機能する可能性がありますが、多くの点で失敗します。たとえば、「yny n」と入力してみてください。コンソール入力は行指向です。あなたの最善の策は、次のように行全体を確実に破棄することです。

scanf( "%c", &choice ) ;
while( choice != '\n' && getchar() != '\n' ) /* do nothing*/ ;
于 2009-12-24T19:16:31.680 に答える
4

さらに良いことに、fgetc()を使用します。scanf()は常に最後の手段である必要があります。

于 2009-12-24T18:13:02.777 に答える
0

最初に簡単に説明します。ポイントが不足しているため、コメントを送信できません。o/p の数が (1 + 文字の数) であることがわかった場合、これは、文字を入力した後に Enter キーを押すためです '\n ' 印刷できない文字も文字列の後に追加されます。

$ ./run
please enter [y]es, [n]o or [m]aybe: y<return>
you selected yes!
Please enter only 'y', 'n' or 'm'!  -----------> it is due to reading of the '\n' by scanf

編集済みポイントが不十分なため、これをコメントとして投稿できます。これは上記の回答の回避策です

于 2015-11-14T14:54:27.353 に答える