STRINGHE Sono sequenze di caratteri (lettere, cifre, caratteri speciali come +, -, *...) trattati come una entità unica. Sono memorizzate come array di caratteri, terminanti con il carattere '\0'. Valore della stringa è l'indirizzo del primo carattere. Le costanti di tipo stringa (string literal) si scrivono tra virgolette. Es: "Ciao, mondo". Inizializzazione di stringa char color[] = "blue"; Inizializza una array di 5 char. È abbreviazione di : char color[] = {'b','l','u','e','\0'}; Inizializzazione di puntatore a stringa char *colorPtr = "blue"; Il pointer colorPtr è inizializzato a puntare alla stringa di caratteri, ma può essere reindirizzato a puntare altrove; color invece avrà sempre lo stesso valore e farà sempre riferimento alla stessa zona di memoria. Lettura e stampa di stringa (con %s) La specifica di conversione %s in scanf si aspetta come argomento una array di caratteri sufficientemente grande da contenere tutti i caratteri della stringa da leggere (fino a ' ','\t','\n' o EOF) più 1 per '\0'. La specifica di conversione %s in printf si aspetta come argomento una array di caratteri stampabili e li stampa tutti fino a quando incontra '\0' che non stampa. Funzioni (molto utili) su stringhe Il qualificatore const indica che il carattere a cui si punta in memoria non deve essere modificato; il puntatore invece può essere modificato. /*ritorna la lunghezza della stringa contenuta in s[] */ int strlen(const char *s) { int n; for (n = 0; *s != '\0' ; s++) n++; return n; } Sono valide le seguenti chiamate: strlen("Ciao, mondo"); strlen(s); 1 /* costante stringa */ /* char s[10] */ /*copia la stringa in t[] dentro s[] */ void strcpy (char *s, const char *t); /*ritorna un intero minore, uguale, maggiore di zero se la stringa s[] precede, è uguale, oppure segue la stringa t[] nell'ordinamento lessicografico */ int strcmp (const char *s, const char *t); /* confronta al più i primi n caratteri delle stringhe e ritorna un intero minore, uguale, maggiore di zero se s[] precede, è uguale, oppure segue t[] nell'ordinamento lessicografico */ int strncmp (const char *s, const char *t, int n); Lettura e stampa di singoli caratteri /* Legge il prossimo carattere dallo standard input e ritorna la sua codifica (0-255) altrimenti ritorna EOF */ int getchar(void); /* Stampa il carattere altrimenti EOF */ int putchar(int c); che ha codifica c; ritorna c Es: int main() { int c; } while( (c = getchar( ))!=EOF ) putchar(c); Lettura e stampa di una intera linea di testo /* Legge la prossima linea di input dentro l’array s, rimpiazzando ‘\n’ con ‘\0’. Ritorna s, oppure NULL se incontra errore o la fine del file */ char *gets(char *s); Es: char linea[80]; gets(linea); /* Scrive la stringa s e aggiunge ‘\n’; ritorna EOF se si verifica un errore altrimenti ritorna un intero non negativo */ int puts(const char *s); 2 Arrays di puntatori Es. : char *giorni[] = {"...","lunedi’","martedi’", "mercoledi’","giovedi'","venerdi'", "sabato ", "domenica"}; giorni[0] ‘.’ ’.’ ‘.’ ‘\0’ giorni[1] ‘l’ ’u’ ‘n’ ‘e’ ‘d’ ‘i’ ‘’’ ‘\0’ giorni[2] ‘m’ ’a’ ‘r’ ‘t’ ‘e’ ‘d’ ‘i’ ‘’’ ‘\0’ giorni[3] giorni[4] giorni[5] giorni[6] giorni[7] giorni è un vettore di puntatori inizializzati alle locazioni di memoria (arbitrarie) in cui il compilatore pone le stringhe. giorni ha dimensione fissa, le stringhe no. giorni[i] è un puntatore al primo carattere dello i-esimo giorno. giorni[1] è il puntatore alla stringa “lunedi'” giorni[i][j] è il j-esimo carattere dello i-esimo giorno. giorni[2][3] è il carattere ‘t’. *giorni[i] è il primo (0-esimo) carattere dello i-esimo giorno. *(giorni[i]+j) è il j-esimo carattere dello i-esimo giorno. Riflettere: ARRAYS MULTI-DIMENSIONALI vs. ARRAYS DI POINTERS 3