Esistono diversi modi per creare una matrice di stringhe in C. Se tutte le stringhe avranno la stessa lunghezza (o almeno avranno la stessa lunghezza massima), è sufficiente dichiarare una matrice 2-d di carattere e assegnare come necessario:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
Puoi anche aggiungere un elenco di inizializzatori:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Ciò presuppone che le dimensioni e il numero di stringhe nell'inizializzatore corrispondano alle dimensioni dell'array. In questo caso, il contenuto di ciascuna stringa letterale (che è essa stessa una matrice di caratteri con terminazione zero) viene copiato nella memoria allocata su strs. Il problema con questo approccio è la possibilità di frammentazione interna; se hai 99 stringhe di 5 caratteri o meno, ma 1 stringa di 20 caratteri, 99 stringhe avranno almeno 15 caratteri inutilizzati; è uno spreco di spazio.
Invece di utilizzare un array 2-d di char, è possibile memorizzare un array 1-d di puntatori su char:
char *strs[NUMBER_OF_STRINGS];
Si noti che in questo caso, è stata allocata solo memoria per contenere i puntatori alle stringhe; la memoria per le stringhe stesse deve essere allocata altrove (o come array statici o usando malloc()
o calloc()
). È possibile utilizzare l'elenco di inizializzatori come nell'esempio precedente:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Invece di copiare il contenuto delle costanti di stringa, è sufficiente memorizzare i puntatori su di esse. Si noti che le costanti di stringa potrebbero non essere scrivibili; puoi riassegnare il puntatore, in questo modo:
strs[i] = "bar";
strs[i] = "foo";
Ma potresti non essere in grado di cambiare il contenuto della stringa; vale a dire,
strs[i] = "bar";
strcpy(strs[i], "foo");
potrebbe non essere permesso.
È possibile utilizzare malloc()
per allocare dinamicamente il buffer per ogni stringa e copiarlo nel buffer:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
Dichiara a come una matrice di 2 elementi di puntatori a matrici di 14 elementi di char.
char (*a[2])[14]
è un array di due puntatori a un array di 14 caratteri.