タブをスペースに変換するdetab

K&R本 演習5-11

プログラムentabとdetabを書き直して、タブストップの並びを引数として受け取るようにせよ。引数がないときは通常のタブ設定を使用せよ。

なんか問題文がややこしいな・・・。

とりあえず今回はdetabだけやります。要はタブを4スペースに変換しろって話ですね。で引数でスペースの数を指定できるようにしろというお話。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main (int argc,char *argv[]) {
    int c;
    int tab = 4;
    int s = 0;
    
    if ( argc > 1 && isdigit(**++argv) ) {
        tab = atoi(*argv);
        if ( tab <= 0 ) tab = 4;
    }
    
    while( (c = getchar()) != EOF ) {
        if ( c == '\t' ) {
            printf("%*c",tab - s,' ');
            s = -1;
        }
        else {
            printf("%c",c);
        }
        if ( c == '\n' ) {
            s = 0;
        }
        else {
            s = (s+1) % tab;
        }
    }
    
    return 0;
}
$ cat test.txt
	aaa
a	aaa
aa	aaa
aaa	aaa
aaaa	aaa
aa		a	a	aaa

$ detab
    aaa
a   aaa
aa  aaa
aaa aaa
aaaa    aaa
aa      a   a   aaa

$ detab 8
        aaa
a       aaa
aa      aaa
aaa     aaa
aaaa    aaa
aa              a       a       aaa

できました。あんまり綺麗なコードではないですね。もっと綺麗にかけるようになりたいです。