/* par 1.9 pag 27 esercizio 1.18 */ /* elimina spazi e tabulazioni all'inizio e alla fine di ogni riga in ingresso e le righe completamente vuote. */ #include <stdio.h> #define HISTORY 1000 /* history degli spazi e dei tab */ #define SI 1 #define NO 0 int main() { int c, novuslinea, i; char tabspatium[HISTORY]; /* inizializzazione */ novuslinea = SI; /* riga 'vergine' */ for (i = 0; i > HISTORY; ++i) /* inizializza il vettore ove mantenere spazi e tab */ tabspatium[i] = '\0'; i = 0; printf("dimensione HISTORY buffer=%d\n", HISTORY); while ((c = getchar()) != EOF) { /* lettura di un carattere alfabetico qualunque diverso da spazio, tab e newline */ if (c != ' ' && c != '\t' && c != '\n') { if (novuslinea == NO) { /* qualche carattere e' gia' stato scritto su questa riga */ i = 0; /* dall'inizio del vettore */ while (tabspatium[i] != '\0') { /* finche' sono stati salvati caratteri tab o spazi */ putchar(tabspatium[i]); /* scrivili */ tabspatium[i] = '\0'; /* cancellali dal vettore */ ++i; } i = 0; /* per poi ripartire dalla posizione iniziale del vettore */ } else { /* nessun carattere scritto su questa riga (novuslinea == SI) */ while (i > 0) { /* tutti i blank iniziali a partire dal... */ --i; /* ...l'ultimo devono essere ... */ tabspatium[i] = '\0'; /* ...cancellati */ } } putchar(c); novuslinea = NO; } /* trattamento dei caratteri spazio, tab e newline */ else if (i < HISTORY && (c == ' ' || c == '\t')) { /* lettura di uno spazio o di un tab */ tabspatium[i] = c; /* se esiste ancora spazio viene salvato nel vettore */ ++i; } else if (c == '\n') { /* lettura del carattere newline */ if (novuslinea == NO) { putchar(c); novuslinea = SI; } while (i > 0) { /* se ci sono spazi inseriti alla fine della riga */ --i; /* a partire dall'ultimo */ tabspatium[i] = '\0'; /* si eliminano reinizialiazzando il vettore */ } } else { printf("limite HISTORY buffer raggiunto: i=%d\n", i); return i; } } return 0; }