私が次のようなことをしようとすると:
int anint;
char achar;
printf("\nEnter any integer:");
scanf("%d", &anint);
printf("\nEnter any character:");
scanf("%c", &achar);
printf("\nHello\n");
printf("\nThe integer entered is %d\n", anint);
printf("\nThe char entered is %c\n", achar);
整数を入力でき、2番目のscanf
を完全にスキップします。これは本当に奇妙です。2つをスワップすると(char
scanfが最初に)、正常に動作します。いったい何が悪いのだろうか?
scanf
を使用して入力を読み取る場合、リターンキーが押された後に入力が読み取られますが、リターンキーによって生成された改行はscanf
によって消費されません。つまり、次回char
標準入力から、改行が読み取られるようになります。
回避する1つの方法は、fgets
を使用して入力を文字列として読み取り、sscanf
を使用して必要なものを次のように抽出することです。
_char line[MAX];
printf("\nEnter any integer:");
if( fgets(line,MAX,stdin) && sscanf(line,"%d", &anint)!=1 )
anint=0;
printf("\nEnter any character:");
if( fgets(line,MAX,stdin) && sscanf(line,"%c", &achar)!=1 )
achar=0;
_
改行を使用する別の方法は、scanf("%c%*c",&anint);
を使用することです。 _%*c
_は、バッファから改行を読み取って破棄します。
あなたはこれを読みたいかもしれません:
他の答えは正しいです-%c
は空白をスキップしません。そのための最も簡単な方法は、%c
の前に空白を置くことです。
scanf(" %c", &achar);
(フォーマット文字列に空白があると、scanf
はすべての連続する空白を消費します)。
2番目のscanf()
はスキップされません。 2番目のscanf()
は、最初のscanf()
が残した改行を読み取ります。ほとんどのフォーマットコードは空白をスキップします。 %c
形式は空白をスキップしません。
各printf呼び出しの後に_flushall()も試してください。 。基本的に、デフォルトではMSのC++はストリーム出力をバッファリングし、フラッシュにより出力ストリームが空になります。
scanf
の前にgetchar()
を呼び出すと、保存されている改行も削除されます。より軽量ですが、より状況に応じて
char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);
改行をフラッシュします。これは、キューに入れられた値が1つだけで、文字列ではないことがわかっているコードの連続する行でより役立ちます。