/* paragrafo 1.9 pagina 31 esercizio 1.22 Spezza le righe in ingresso troppo lunghe in due o piu' righe brevi; la riga e' interrotta dopo l'ultimo carattere diverso da uno spazio che occorra prima dell'n-esima colonna di testo in ingresso. */ #include <stdio.h> #define MAXLINE 1000 /* lunghezza massima della riga in input */ #define MARGINE 30 /* massima lunghezza in output della riga */ int getline(char line[], int maxline); /* input di una riga terminata da newline */ int is_separator(char c); /* verifica se c e' una lettera o un numero */ int main() { char line[MAXLINE]; int i, j, len; printf("Dimensione buffer: %4d caratteri, limite output: %3d\n", MAXLINE, MARGINE); while ((len = getline(line, MAXLINE)) > 0) { i = 0; j = MARGINE - 1; while (j < len) { while (j > i && is_separator(line[j]) == 0) --j; if (j == i) j = j + MARGINE - 1; for ( ; i <= j; ++i) putchar(line[i]); if (line[i] != '\n' && line[i] != '\0') putchar('\n'); j = i + MARGINE - 1; } for ( ; i <= len; ++i) putchar(line[i]); if (line[len - 1] != '\n') putchar('\n'); } return 0; } /* getline: legge una riga in ingresso, la assegna a s, ne restituisce la lunghezza */ int getline(char s[], int lim) { int c, i; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) { s[i] = c; } if (c == '\n') { s[i] = c; ++i; } s[i] = '\0'; return i; } /* is_separator: verifica se il carattere e' un separatore di parole. Considera appartenente all'alfabeto le lettere maiuscole e minuscole e le cifre. Qualunque altro carattere ascii e' un separatore. Se e' un separatore restituisce 1, se e' una lettera o una cifra restituisce 0. Non ho idea di come funzioni coi caratteri Unicode e le lettere accentate! */ int is_separator(char c) { if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')) return 0; else return 1; }