Array di stringhe in C

Lasha Khintibidze 30 marzo 2021
  1. Usa la notazione array 2D per dichiarare array di stringhe in C
  2. Usa la notazione array char* per dichiarare array di stringhe in C
Array di stringhe in C

Questo articolo illustrerà più metodi su come dichiarare un array di stringhe in C.

Usa la notazione array 2D per dichiarare array di stringhe in C

Le stringhe in C sono semplicemente una sequenza di caratteri immagazzinati in una regione di memoria contigua. Una distinzione sulle stringhe di caratteri è che c’è un byte nullo di terminazione \0 memorizzato alla fine della sequenza, che denota la fine di una stringa. Se dichiariamo un array fisso di char usando la notazione [], allora possiamo memorizzare una stringa composta dallo stesso numero di caratteri in quella posizione.

Si noti che uno spazio di caratteri in più per il byte nullo di terminazione dovrebbe essere considerato quando si copia la stringa di caratteri nella posizione dell’array. Quindi, si può dichiarare un array bidimensionale char con la notazione delle parentesi e utilizzarlo come array di stringhe. La seconda dimensione dell’array limiterà la lunghezza massima della stringa. In questo caso, definiamo arbitrariamente una macro costante - MAX_LENGTH uguale a 100 caratteri. L’intero array può essere inizializzato con la notazione {""}, che azzera ogni elemento char dell’array. Quando si memorizzano i valori della stringa nell’array già inizializzato, l’operatore di assegnazione non è consentito e dovrebbero essere impiegate speciali funzioni di copia della memoria come strcpy.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main(){

    char arr[NUM_STRINGS][MAX_LENGTH] = {""};

    arr2[0] = "string literal"; // Not permitted
    strcpy(arr[0], "hello world");
    printf("%s\n", arr[0]);
    printf("%s\n", strcpy(arr[0], "hello world"));

    exit(EXIT_SUCCESS);
}

Produzione:

hello world
hello world

In alternativa, possiamo inizializzare immediatamente l’array bidimensionale char quando dichiarato. Il moderno standard C11 consente di inizializzare array char con stringhe letterali e persino di memorizzare automaticamente byte nulli alla fine della stringa quando la lunghezza dell’array è maggiore della stringa stessa. La notazione dell’lista inizializzatore è simile alla sintassi C++. Ogni elemento tra parentesi graffe dovrebbe essere memorizzato in una regione di memoria consecutiva di lunghezza MAX_LENGTH. Nel caso in cui la notazione dell’inizializzatore specifichi il minor numero di elementi rispetto alla dimensione dell’array, gli elementi rimanenti vengono inizializzati implicitamente con \0 byte.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main(){
    char arr2[NUM_STRINGS][MAX_LENGTH] = { {"first string"},
                                          {"second string"},
                                          {"third string"},
                                          {"fourth string"},
                                          {"fifth string"} };

    for (int i = 0; i < NUM_STRINGS; ++i) {
        printf("%s, ", arr2[i]);
    }

    exit(EXIT_SUCCESS);
}

Produzione:

first string, second string, third string, fourth string, fifth string, , , , , ,

Usa la notazione array char* per dichiarare array di stringhe in C

char* è il tipo generalmente utilizzato per memorizzare le stringhe di caratteri. Dichiarare l’array di char* ci dà il numero fisso di puntatori che puntano allo stesso numero di stringhe di caratteri. Può essere inizializzato con stringhe letterali come mostrato nel seguente esempio, assegnato o copiato utilizzando funzioni speciali fornite nell’intestazione string.h.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define MAX_LENGTH 100
#define NUM_STRINGS 10

int main(){
    char *arr3[NUM_STRINGS] = { "first string",
                                "second string",
                                "third string",
                                "fourth string",
                                "fifth string" };
    char* str1 = "string literal";
    arr3[8] = str1;
    arr3[9] = "hello there";

    for (int i = 0; i < NUM_STRINGS; ++i) {
        printf("%s, ", arr3[i]);
    }
    printf("\n");

    exit(EXIT_SUCCESS);
}

Produzione:

first string, second string, third string, fourth string, fifth string, (null), (null), (null), string literal, hello there,

In alternativa, si possono specificare solo le parentesi graffe {}, che inizializzeranno i puntatori nell’array a null, e possono essere successivamente utilizzate per memorizzare altri indirizzi di stringa, oppure il programmatore può anche allocare memoria dinamica.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define NUM_STRINGS 10

int main(){
    char *arr4[NUM_STRINGS] = {};
    for (int i = 0; i < NUM_STRINGS; ++i) {
        printf("%s, ", arr4[i]);
    }
    printf("\n");

    exit(EXIT_SUCCESS);
}

Produzione:

(null), (null), (null), (null), (null), (null), (null), (null), (null), (null),

Articolo correlato - C Array

Articolo correlato - C String