Questa è una vecchia versione del documento!
Indice
Esercitazione 2
Stringhe e libreria standard di IO, creazione di librerie statiche.
Cercare di completare tutti gli esercizi durante le ore di laboratorio e nel caso come homework.
Esercizio 1: tokenizer
Scrivere un programma che data una stringa come argomento, stampi a video ('stdout') le parole contenute nella stringa in input una per linea. Usare la funzione di libreria 'strtok'. Per realizzare il programma implementare la funzione 'tokenizer' con la seguente segnatura:
void tokenizer(char *stringa, FILE *out);
Testare il programma con i seguenti casi (supponiamo che l'eseguibile si chiami es1):
./es1 "ciao mondo" ./es1 ./es1 "questa e' una stringa di alcune parole!" ./es1 questa è un\'altra stringa
Esercizio 2: tokenizer_r
Scrivere una seconda versione del programma precedente che implementa la funzione 'tokenizer_r' che ha la stessa identica interfaccia ma che utilizza al suo interno 'strtok_r'. Quali sono le principali differenze tra 'tokenizer' e 'tokenizer_r' ? (Suggerimento: partire dall'analisi accurata del 'man' di 'strtok_r').
NOTA: se si compila con '-std=c99' per evitare il warning implicit declaration of function 'strtok_r'…
aggiungere la seguente opzione di compilazione '-D_POSIX_C_SOURCE=199309L'.
Esercizio 3: tokenizer_rfile
Scrivere un programma C che prende in input 3 argomenti, i primi due argomenti sono obbligatori, il terzo e' opzionale. Il primo argomento è il nome di un file di input in formato testuale contenente stringhe di parole. Ogni stringa ha una lunghezza massima pari a 1024 caratteri. Il secondo argomento corrisponde ad un file di output che dovra' contenere tutte le parole del primo file, una per ogni riga. Se il file di input non esiste il programma dovrà ritornare un messaggio opportuno di errore sullo standard error. Se il file di output esiste questo dovra' essere sovrascritto se il terzo argomento del programma non è stato specificato oppure se è diverso dal carattere 'a'. Se il terzo argomento è uguale al carattere 'a' l'output del programma dovrà essere appeso in fondo.
Esercizio 4: valgrind
Verificare la correttezza degli accessi in memoria utilizzando 'valgrind' del programma realizzato nell'esercizio 3.
Esercizio 5: libtokenizer.a
Inserire nel file 'tokenizer.h' l'interfaccia delle due funzioni 'tokenizer' e 'tokenizer_r' come descritte negli esercizi 1 e 2. Inserire nel file 'tokenizer.c' l'implementazione delle due funzioni. Creare quindi una librerie statica 'libtokenizer.a' e riscrivere il programma dell'esercizio precedente in modo che il programma main includa il file 'tokenizer.h' e linki la libreria.