scanfの戻り値を調べてみた

scanf関数は、C言語の入門編で頻出の関数です。
whileのループとの組み合わせで用いられることが多い気がしましたので、
そのメカニズムについて検証してみました。

まずは以下のプログラムを作成しました。

/* scanf_test.c */
#include

int main(void)
{
int a;
int b;

printf("Enter integer data.\n");
b = scanf("%d", &a);

printf("a = %d\n", a);
printf("b = %d\n", b);

return 0;
}


これをscanf_testをコンパイルしてscanf_testという実行ファイルを生成したとします。
以下のようにしてscanf_testプログラムを通じて、scanf関数の戻り値(bに格納されている)をテストしてみました。

$ ./scanf_test
Enter integer data.
20
a = 20
b = 1
$ ./scanf_test
Enter integer data.
0
a = 0
b = 1
$ ./scanf_test
Enter integer data.
-3
a = -3
b = 1
$ ./scanf_test
Enter integer data.
T
a = 7864308
b = 0
$ ./scanf_test
Enter integer data.   ##ここではCntrol + D(End Of File)を入力している
a = 16359412
b = -1

aをint型で宣言したので、それに不適合な変数が格納されようとすると、scanfは0や-1を返すようです。

この性質を利用すれば、whileループと組み合わせて、効率よく目的のデータ型の変数を取得できます。

/* scanf_test_2.c */
#include
int main(void)
{
int a;
int b;
printf("Enter integer data.\n");
printf("Enter q(別に数字以外ならなんでもいいけど) to quit the program.\n");
while(scanf("%d",&a) == 1){
printf("Your input data is %d\n", a);
}
return 0;
}



$ ./scanf_test_2
Enter integer data.
Enter q(別に数字以外ならなんでもいいけど) to quit the program.
3
Your input data is 3
0
Your input data is 0
-4
Your input data is -4
q