1-21 entab.c
detabとループ周りが似ますな、やはり。
しかし問題文のくどいことくどいこと…
/* * P42 演習1-21 * ブランクの列を同じスペーシングを行う最小の数のタブおよび * ブランクで置き換えるプログラムentabを書け。detabと同じ * タブ・ストップを使え。タブ・ストップに達するのに、タブ * あるいは単一のブランクのいずれかで十分なときに、どちらを * 使うべきか? * * * 2007/06/11 arikui */ #include <stdio.h> int main(void){ int n = 4; /* tab stop */ int c, i, tab, col = 0, spc = 0; while((c = getchar()) != EOF){ if (c == ' '){ ++spc; }else{ if (spc > 1){ tab = (spc - col) / n; col += spc; if (tab > 0){ for(i = 0; i < tab; ++i) putchar('\t'); } }else if (spc == 1) putchar(' '); spc = 0; if (c == '\t') col += n - col % n; else if (c == '\n') col = 0; else ++col; putchar(c); } } return 0; }