入力ストリームへ一文字だけもどせるungetc関数

K&R本 7.8.3

ungetcを使うとgetchar等で取得した文字を一つだけ戻すことができます。

ためしに二つ進んで一つ戻す処理を書いてみます。

#include <stdio.h>

int main (void) {
    int c;
    int i = 0;
    
    while( (c = getchar()) != EOF ) {
        printf("%c",c);
        if ( (i = (i+1) % 2) == 0 ) {
            ungetc(c,stdin);
        }
    }
    
    return 0;
}
$ cat main.c | main
##iinncclluuddee  <<ssttddiioo..hh>>



iinntt  mmaaiinn  ((vvooiidd))  {{

        iinntt  cc;;

        iinntt  ii  ==  11;;



        wwhhiillee((  ((cc  ==  ggeettcchhaarr(())))  !!==  EEOOFF  ))  {{

                pprriinnttff((""%%cc"",,cc));;

                iiff  ((  ((ii  ==  ((ii++11))  %%  22))  ====  00  ))  {{

                        uunnggeettcc((cc,,ssttddiinn));;

                }}

        }}



        rreettuurrnn  00;;

}}

なんか目がおかしくなりそう(笑)

しかしこの関数、扱いが難しそうですね。一文字だけ戻したいという用途ってあるんでしょうか。