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を表せられない