Array di Stringhe in Linguaggio C

In questa lezione studieremo come dichiarare Array Statici di Stringhe in linguaggio C.

Vedremo che esistono due modi per definire un array di stringhe in C: array statici e array jagged. Gli array statici sono più semplici da gestire, ma sprecano spazio. Gli array jagged, invece, sono più efficienti, ma non possono essere modificati.

Array statici di Stringhe

Una delle esigenze che si presenta spesso nella programmazione C, è quella di memorizzare un array di stringhe. In questa lezione ci concentriamo sul caso statico, ovvero quando il numero di stringhe è noto a priori. Nelle future lezioni, quando studieremo la gestione dinamica della memoria, vedremo come gestire array di stringhe di lunghezza variabile.

Per dichiarare un array di stringhe in C, dobbiamo ricordarci che una stringa è, in realtà, un array di caratteri terminato da un carattere nullo '\0'. Quindi, un array di stringhe non è altro che un array multidimensionale di stringhe.

Pertanto, per definire un array multidimensionale di char (ovvero un array di stringhe), possiamo utilizzare la seguente sintassi:

char giorni[][10] = {
    "Lunedì",
    "Martedì",
    "Mercoledì",
    "Giovedì",
    "Venerdì",
    "Sabato",
    "Domenica"
};

In questo esempio, giorni è un array di stringhe, ciascuna delle quali può contenere fino a 9 caratteri (10, considerando il terminatore nullo). L'array giorni è inizializzato con 7 stringhe, ciascuna delle quali rappresenta un giorno della settimana.

Da notare che, nel definire l'array, abbiamo omesso la dimensione della prima dimensione. Questo è possibile perché il compilatore può dedurre la dimensione della prima dimensione dall'inizializzazione dell'array. Tuttavia, siamo stati costretti a specificare la dimensione della seconda dimensione, poiché il compilatore non può dedurla.

In memoria, il nostro array di stringhe non sarà altro che una matrice di caratteri. In particolare, una matrice composta da 7 righe e 10 colonne, dove ciascuna riga rappresenta una stringa. Per comprendere meglio la disposizione in memoria, osserviamo la figura che segue:

Esempio di Array Statico di Stringhe
Figura 1: Esempio di Array Statico di Stringhe

Dalla figura risulta subito chiara una cosa: le stringhe che contengono meno di 10 caratteri (incluso il terminatore) sono riempite con terminatori fino a raggiungere la lunghezza massima. In gergo tecnico si parla di padding. Questo è necessario per garantire che ciascuna stringa abbia la stessa lunghezza in memoria. Tuttavia, rappresenta uno spreco di spazio.

In C, questa inefficienza è comune quando si lavora con le stringhe, dal momento che molte collezioni di stringhe devono contenere stringhe di lunghezza variabile. Questa è la principale differenza rispetto ad array contenenti dati di lunghezza fissa, come gli stessi tipi primitivi, dove la dimensione è nota a priori.

Definizione

Array Statici di Stringhe

Un array statico di stringhe in C è un array multidimensionale di caratteri, dove ciascuna riga rappresenta una stringa. La dimensione della prima dimensione può essere omessa, mentre la dimensione della seconda dimensione deve essere specificata. La dimensione della seconda dimensione rappresenta la lunghezza massima di ciascuna stringa.

La sintassi per dichiarare un array statico di stringhe è la seguente:

char array[][N] = {
    "stringa1",
    "stringa2",
    "stringa3",
    ...
};

dove N rappresenta la lunghezza massima di ciascuna stringa.

Array Jagged di Stringhe

Il problema dello spreco di spazio visto sopra può essere risolto con gli array jagged chiamati anche array irregolari o matrici irregolari.

Nativamente, il linguaggio C non supporta gli array jagged. Tuttavia, possiamo simulare un array jagged utilizzando un array di puntatori a caratteri. In questo modo, possiamo creare un array di stringhe di lunghezza variabile, senza sprechi di spazio.

Ritornando all'esempio di prima, possiamo modificare il codice in questo modo:

char *giorni[] = {
    "Lunedì",
    "Martedì",
    "Mercoledì",
    "Giovedì",
    "Venerdì",
    "Sabato",
    "Domenica"
};

In questo caso, giorni è un array di puntatori a caratteri. Ogni elemento dell'array punta a una stringa. La disposizione in memoria è rappresentata in figura:

Esempio di Array Jagged di Stringhe
Figura 2: Esempio di Array Jagged di Stringhe

In questo caso, non c'è spreco di spazio, poiché ogni stringa occupa solo lo spazio necessario per i suoi caratteri. Tuttavia, dobbiamo fare attenzione a non modificare le stringhe, poiché sono memorizzate in una sezione di sola lettura della memoria.

In questo caso, abbiamo creato un array jagged statico. Non possiamo modificare il numero di elementi e non possiamo modificare le stringhe senza causare effetti indesiderati. Nelle lezioni sulla gestione dinamica della memoria, vedremo come crearli e modificarli in maniera dinamica.

Definizione

Array Jagged Statici di Stringhe

Un array jagged statico di stringhe in C è un array di puntatori a caratteri, dove ciascun puntatore punta a una stringa.

La sintassi per dichiarare un array jagged statico di stringhe è la seguente:

char *array[] = {
    "stringa1",
    "stringa2",
    "stringa3",
    ...
};

In Sintesi

In questa lezione abbiamo visto come definire array di stringhe in C. Abbiamo analizzato due approcci: array statici e array jagged. Gli array statici sono più semplici da gestire, ma sprecano spazio. Gli array jagged, invece, sono più efficienti, ma non possono essere modificati.

Nella prossima lezione vedremo un'applicazione importantissima degli array di stringhe: l'accesso agli argomenti della riga di comando.