Osservazione
sulle stringhe
Per memorizzare singoli
caratteri
si usano variabili di tipo char.
Le sequenze di caratteri,
chiamate stringhe dagli
informatici, possono quindi
essere memorizzate come array di caratteri. Per agevolare il
trattamento delle stringhe, il C mette a disposizione la sintassi coi
doppi apici (che abbiamo già utilizzato con
printf e scanf).
Vediamo alcuni esempi di dichiarazione di stringhe:
// dichiara un vettore di 100 caratteri, senza inizializzarlo
char a[100];
// dichiara e inizializza un vettore di 5 caratteri
char vocali[] = { 'a' , 'e' , 'i' , 'o' , 'u' };
// dichiara e inizializza un vettore di 5 caratteri
// (tramite i corrispondenti codici ASCII)
char vocali_da_ASCII[] = { 97 , 101 , 105 , 111 , 117};
// dichiara e inizializza una stringa
char saluto[] = "Ciao mondo!";
La sintassi
dell'ultima istruzione definisce un array
di lunghezza
N+1, dove N è la
lunghezza
della stringa: l'ultima casella dell'array contiene il carattere
speciale '\0'. Nell'esempio
abbiamo un array di 12 posizioni.
C | i | a | o | m | o | n | d | o | ! | \0 | carattere | |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | posizione |
Notare
la differenza tra l'uso di apici singoli e
quello di apici doppi:
char x = 'a'; // ok
char y = "b"; // NO!!!
char z[] = "c"; // ok
char w[] = 'd'; // NO!!!
Sappiamo che per stampare un array è importante
conoscerne la
lunghezza, altrimenti potremmo accedere a zone di memoria che non
erano state allocate per l'array. Lo stesso ragionamento vale per le
stringhe, che sono array particolari. Come esempio è istruttivo
provare a compilare ed eseguire il seguente programma:
/* |
Notare che una variabile di tipo carattere viene
stampata come carattere se invocata con l'opzione %c,
e viene stampata come numero intero (corrispondente al suo codice
ASCII) se invocata con l'opzione %d.
Se mandate in esecuzione il programma dovreste notare qualcosa di particolarmente strano... che evidenzia il modo in cui sono allocate le variabili nella memoria.
Provate a rispondere alle seguenti domande:
Per stampare una stringa possiamo
utilizzare direttamente
printf,
senza doverci preoccupare di scorrerla
carattere per carattere:
Analogamente, con scanf possiamo leggere da tastiera direttamente una stringa, senza doverci preoccupare di leggerla un carattere per volta:
char nome[] = "Mario Rossi";
printf("ciao %s, come stai?\n",nome);
char nome[51];
printf("Come ti chiami? (max 50 caratteri)\n");
scanf("%s",nome);
Notare che questa
volta non serve il simbolo & davanti a
nome.
Attenzione: Se si immette un numero maggiore di
caratteri si
rischia di sovrascrivere delle zone di memoria con altri dati.
Nota: In questo modo però la stringa
viene letta solo
fino al primo carattere di separazione (spazio, tabulazione, new
line). Per evitarlo possiamo fare un ciclo di lettura che esamina un
carattere alla volta e termina quando si digita un carattere
speciale (es. il tasto ESC).
int i=0;
char stringa[LUNGHEZZA_MAX+1];
scanf("%c",&stringa[i]); // leggo il primo carattere
while ( i<LUNGHEZZA_MAX && // se c'è spazio e
stringa[i]!=27 && // ... l'ultimo carattere letto non è ESC e
stringa[i]!='\0') { // ... l'ultimo carattere letto non è '\0', allora...
i++;
scanf("%c",&stringa[i]); // leggo il prossimo carattere
}
stringa[i]='\0'; // metto '\0' come ultimo carattere
Invece della primitiva scanf di lettura formattata, possiamo anche usare la funzione getchar():
int i=0;
char stringa[LUNGHEZZA_MAX+1];
stringa[i]=getchar(); // leggo il primo carattere
while ( i<LUNGHEZZA_MAX && // se c'è spazio e
stringa[i]!=27 && // ... l'ultimo carattere letto non è ESC e
stringa[i]!=EOF && // ... l'ultimo carattere letto non è EOF e
stringa[i]!='\0') { // ... l'ultimo carattere letto non è '\0', allora...
i++;
stringa[i]=getchar(); // ... leggo il prossimo carattere
}
stringa[i]='\0'; // metto '\0' come ultimo carattere
Esercitazione non guidata
<>Risolvere il seguente esercizio e spedire il solo file sorgente (suffisso .c) all'indirizzo paolo.santi@iit.cnr.it come attachment di un messaggio di posta elettronica con subject: Esercitazione Lezione 6, indicando il vostro nome, cognome e gruppo di appartenenza.