web-dev-qa-db-ja.com

scanf( "%c"、&c)とscanf( "%c"、&c)の違い

次のCコードスニペットについて考えてみます。

#include <stdio.h>

int main()
{
    int a;
    char c;
    scanf("%d",&a);
    scanf("%c",&c);
    printf("int=%d\n",a);
    printf("char=%c\n",c);
}

文字ではなく整数のみを入力できます。出力は単に整数値であり、2番目のprintfステートメントの値は出力されません。

ただし、フォーマット指定子の前にスペースを使用すると、次のようになります。

scanf(" %c",&c);

期待どおりに動作します。なぜそうなのですか?

誰かが、入力バッファをクリアすることと関係があると私に言いました。誰かが同じことに光を当てることができますか?

8
passmaster10

scanf("%c", &c1)scanf(" %c", &c2)の違いは、空白のない形式は空白であっても次の文字を読み取るのに対し、空白のある形式は空白(改行を含む)をスキップすることです。空白ではない次の文字を読み取ります。

scanf()形式では、空白、タブ、または改行は、「スキップするものがある場合は空白をスキップする」ことを意味します。 '入力バッファを直接クリアする'ことはありませんが、入力バッファをクリアするのと同じように見える空白をすべて消費します(ただし、それとはまったく異なります)。 Windowsを使用している場合、fflush(stdin)を使用すると、(空白文字と非空白文字の)入力バッファーがクリアされます。 Unixでは、C標準によれば、fflush(stdin)は未定義の動作です。

ちなみに、整数の直後にキャリッジリターンを入力した場合、プログラムの出力は2つの改行で終了します。1つ目はcで、2つ目はフォーマット文字列です。したがって、あなたは見たかもしれません:

_$ ./your_program
123
int=123
char=

$
_

つまり、scanf()は改行を入力として読み取ります。別の入力を検討してください。

_$ ./your_program
123xyz
int=123
char=x
$
_

'x'を読み取ると、整数入力が停止しました。したがって、文字入力は「x」を読み取ります。

8

番号を入力してEnterキーを押すと、新しい行はバッファに残り、2番目のscanfによって処理されるためです。

つまり、変数cに改行を保存しました。

ただし、使用する場合

scanf(" %c",&c);
//     ^

スペースは改行を消費するため、cは期待した値になります。

2
Yu Hao