scanfでEOF
scanfはEOFを返却値で扱う.
引数にした変数には格納されない.
目的
2桁以上の数値を文字列として扱ってから整数に直したい.
getchar()でのEOFは分かるので,無理矢理以下のようにできる.
#include <stdio.h> int main() { int ch, val = 0; while( (ch = getchar()) != EOF ){ if( ch == ' ' ){ printf("%d\n", val); val = 0; continue; } if( ch == '\n' ) continue; val = val * 10 + (ch - '0'); } printf("%d\n", val); return 0; }
- 入力
123 456 789
- 出力
123 456 789
しかし,ソースコードの見栄えが悪い.
scanfはスペースで区切って取得するので,scanfでEOFを扱えたら一番良さそう.
結論
scanfは返却値でEOFを扱う.
引数で与えたchar型変数(配列)のどこにも格納されない*1.
つまり上記のソースコードをscanfで書き換えると以下のようになる.
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char ch[256]; while( scanf("%s", ch) != EOF ){ if( strcmp(ch, "\n") == 0 ) continue; printf("%d\n", atoi(ch)); } return 0; }
入出力は同上.
scanfは,通常,入力を受けて引数に代入した個数を返却値とする.
だから,入力がない場合は0を返却すると思い込んでいたら,EOFだった.
無意識に ch = getchar() と書いているけれど,つまりこれも返却値なので当然と言えば当然なのかもしれない.
*1:そもそもchar型ではEOFを表せられない