web-dev-qa-db-ja.com

単純なC scanfが機能しませんか?

私が次のようなことをしようとすると:

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が最初に)、正常に動作します。いったい何が悪いのだろうか?

20
John

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 FAQ:scanfを使用しないと誰もが言うのはなぜですか?

25
codaddict

他の答えは正しいです-%cは空白をスキップしません。そのための最も簡単な方法は、%cの前に空白を置くことです。

scanf(" %c", &achar);

(フォーマット文字列に空白があると、scanfはすべての連続する空白を消費します)。

15
caf

2番目のscanf()はスキップされません。 2番目のscanf()は、最初のscanf()が残した改行を読み取ります。ほとんどのフォーマットコードは空白をスキップします。 %c形式は空白をスキップしません。

5

各printf呼び出しの後に_flushall()も試してください。 。基本的に、デフォルトではMSのC++はストリーム出力をバッファリングし、フラッシュにより出力ストリームが空になります。

0
rkellerm

scanfの前にgetchar()を呼び出すと、保存されている改行も削除されます。より軽量ですが、より状況に応じて

char input_1;
char input_2;
getchar();
scanf("%c", &input_1);
getchar();
scanf("%c", &input_2);

改行をフラッシュします。これは、キューに入れられた値が1つだけで、文字列ではないことがわかっているコードの連続する行でより役立ちます。

0
Dale Diaz