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;
}