scanfの %c と getchar

コンピュータの中央処理装置と入出力装置の間における情報のやり取りは、 ほとんどが文字を使った情報で行われます。 標準入力(stdin)への入力元も例外ではありません。
つまり、押したキーの文字コードの番号が 標準入力バッファと呼ばれる 内部のchar型記憶場所に記憶されます。

scanfは、第1引数の指定に従って、このバッファ内を走査(scan)し、 %直後の指示に従って合っている場合だけ文字の並びを取り出して動作します。
%dは、このバッファから取り出した文字並びを数値に変換して、引数のアドレスが指し示す 記憶内容を変更します。
そして、このバッファから単純に1char分取り出して、引数のアドレスが指し示す 1byte記憶域を変更する指定が%cになっています。
これは、標準バッファにある半角スペースの' 'や、タブの'\t'や、 Enterの改行文字の'\n' など、 何でも取り出して、引数が指し示す1byteの記憶域に設定します。
以下に実行例を示します。が入力です。     (ASCIIコード表参照

プログラム実行結果
                                           
#include<stdio.h>
main()
{
	char c;
	char a[3];
	scanf("%c", & c);
	scanf("%c", a );
	scanf("%c", a+1 );
	scanf("%c", a+2 );
	putchar( c );
	putchar( a[0] );
	putchar( a[1] );
	putchar( a[2] );
	printf("\n\n%d\n", c);
}
12
3
12
3                  

49





このように、単純に文字コード(整数)を標準入力バッファから取り出して利用する場合は、よりシンプルなgetcharが使われます。 これは、取り出した文字コードが戻り値になります。以下でその例と動作を説明します。
進む順番で説明します。⇒ (step1)


プログラム実行結果
                                           
#include<stdio.h>
main()
{
	char c;
	char a[3];
	c = getchar();               
	a[0] = getchar();
	a[1] = getchar();
	a[2] = getchar();
	putchar( c );
	putchar( a[0] );
	putchar( a[1] );
	putchar( a[2] );
	printf("\n\n%d\n", c);
}
12
3
12
3                  

49





なお、getcharを使う場合は、stdio.hをインクルードしなければなりません。 また、scanfやgetcharは、入力ストームが閉じた後の実行など、入力が失敗した場合にEOFを返す仕様になっています。 EOFは、stdio.hの中でdefineされている定義済みの名前で、通常は-1の値です。