STRINGHE Sono sequenze di caratteri (lettere, cifre, caratteri

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