Laboratorio di Programmazione. AA 2007/08.
Esercitazione n. 11

Scopo di questa esercitazione è di familiarizzarsi con le function di input/output del C e in particolare con la lettura di stringhe mediante scanf.

Al solito, si suggerisce di creare una directory apposita per i files relativi a questa esercitazione.
Ricordare inoltre che i prototipi delle function di libreria per operare sulle strighe risiedono nel file di header string.h.


     
  1. Leggera una stringa lunga meno di 20 caratteri da stdin mediante scanf("%s",buf)   assegnandola ad un array di caratteri dichiarato come  char buf[20]; e far scrivere la lunghezza effettiva della stringa (inclusiva del carattere di terminazione della stringa, calcolabile come strlen(buf)+1) oltre alla stringa stessa. Immettere in input una stringa di lunghezza maggiore o uguale a 20 caratteri. Cosa succede ?

    Modificare il convertitore di formato in "%20s" e riprovare a dare un input più lungo di 20 caratteri. Che succede se l' input consta di esattamente 20 caratteri ?


  2. Se la stringa in input nel precedente esercizio contiene spazi, con il convertitore di formato %s si legge solo a partire dal primo carattere diverso da spazio fino a (ed escluso) il prossimo spazio (o newline). Per leggere una stringa che contenga spazi occorre il seguente convertitore di formato: "%[^\n]" (legge dall' inizio della riga di input fino al carattere di newline).

    Provare nel precedente programma (anche nella versione "%20[^\n]") e verificarne il funzionamento.

  3. Il valore di ritorno di scanf (o fscanf o sscanf) è  un intero che conta gli argomenti che sono stati letti con successo. Creare un file di testo contenente poche linee in ciascuna delle quali sia scritto un intero. Aprire il file in lettura mediante fopen ed usare il valore di ritorno di scanf (con convertitore di formato adatto alla lettura di interi) per contare i dati da leggere.  Quindi allocare spazio per un array in grado di contenere gli interi del file,  ritornare all' inizio del file (istruzione rewind) e rileggerlo riempiendo gli elementi dell' array.


  4. Utilizzare  getchar e putchar per realizzare un programma che scriva su stdout i caratteri di input,  trasformando le eventuali lettere maiuscole in minuscole.


  5. Definiamo parola ogni sequenza di caratteri separati da un numero arbitrario di spazi o da segni di interpunzione (,.;:?!) o dal carattere di newline ('\n'). Pianificare e implementare un programma che conti le parole di un file secondo la definizione sopra data.


  6. Il seguente programma contiene un errore. Compilarlo con l' opzione -g in modo da poter utilizzare al meglio il debugger per seguire l' esecuzione passo dopo passo alla ricerca dell' errore.
    #include <stdio.h>
    #include <math.h>
    
    int main(void){
    
        float i, x=0;   
        for (i=0; i!=10; i+=0.1 )
            x+=sqrt(i);
        printf("%d\n", i);
    }
    
    
    N.B. L' esercizio, svolto in laboratorio utilizzando l' interfaccia grafica ddd per il debugger gdb, può essere ignorato da chi, non potendo seguire le lezioni, si trovasse a operare in ambiente diverso da quello unix/gnu dell' aula informatica.