/* par 1.10 pag 31 esercizio 1.21 Rimpiazza le stringhe di spazi bianchi con il numero minimo di caratteri di tabulazione e di singoli spazi necessario per ottenere la medesima spaziatura N.B. idea tratta da Learn To Solve It */ #include <stdio.h> #define TAB 4 /* numero di spazi bianchi equivalente a una tabulazione */ int main() { int c, i, tab, blank; i = 0; /* indica la posizione del cursore tra due tabulazioni */ tab = 0; /* numero di caratteri di tabulazione da inserire */ blank = 0; /* numero di spazi bianchi da inserire */ while ((c = getchar()) != EOF) { ++i; /* sposta in avanti il cursore */ if (c == ' ') { /* inserito uno spazio bianco */ if (i % TAB == 0) { /* posizione del cursore coincidente con una tabulazione */ ++tab; /* incrementa il numero di tab da inserire */ blank = 0; /* azzera gli spazi da inserire */ } else { /* cursore non coincidente con la tabulazione */ ++blank; /* incrementa il numero di spazi da inserire */ } } else { /* carattere diverso da uno spazio bianco */ for ( ; tab > 0; --tab) /* scrittura di tutti i tab conteggiati */ putchar('\t'); if (c == '\t') { /* se e' stato inserito direttamente un TAB */ putchar('\t'); /* ...in output anche lui */ blank = 0; /* azzeramento degli spazi bianchi rimanenti */ i = 0; /* cursore coincidente con una posizione di tabulazione */ } else { /* se NON e' stato inserito direttamente un TAB */ for ( ; blank > 0; --blank) /* inserisce gli spazi bianchi accumulatisi... */ putchar(' '); /* ...insufficienti per formare un ulteriore tab */ putchar(c); /* output del carattere inserito */ if (c == '\n') { /* e se e' un newline */ i = 0; /* rimetti il cursore in coincidenza con la tabulazione */ } } } } }