Il y a plusieurs façons de créer un tableau de chaînes en C. Si toutes les chaînes vont être de la même longueur (ou au moins avoir la même longueur maximale), vous déclarez simplement un tableau 2D de caractères et attribuez-le si nécessaire:
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");
Vous pouvez également ajouter une liste d'initialiseurs:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Cela suppose que la taille et le nombre de chaînes dans l'initialiseur correspondent aux dimensions de votre tableau. Dans ce cas, le contenu de chaque chaîne littérale (qui est elle-même un tableau de caractères terminé par zéro) est copié dans la mémoire allouée aux chaînes. Le problème avec cette approche est la possibilité de fragmentation interne; si vous avez 99 chaînes de 5 caractères ou moins, mais 1 chaîne de 20 caractères, 99 chaînes auront au moins 15 caractères inutilisés; c'est une perte d'espace.
Au lieu d'utiliser un tableau de caractères 2D, vous pouvez stocker un tableau de pointeurs 1D vers char:
char *strs[NUMBER_OF_STRINGS];
Notez que dans ce cas, vous n'avez alloué que de la mémoire pour contenir les pointeurs vers les chaînes; la mémoire des chaînes elles-mêmes doit être allouée ailleurs (soit sous forme de tableaux statiques, soit en utilisant malloc()
ou calloc()
). Vous pouvez utiliser la liste d'initialisation comme dans l'exemple précédent:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Au lieu de copier le contenu des constantes de chaîne, vous stockez simplement les pointeurs vers elles. Notez que les constantes de chaîne peuvent ne pas être accessibles en écriture; vous pouvez réaffecter le pointeur, comme ceci:
strs[i] = "bar";
strs[i] = "foo";
Mais vous ne pourrez peut-être pas modifier le contenu de la chaîne; c'est à dire,
strs[i] = "bar";
strcpy(strs[i], "foo");
peut ne pas être autorisé.
Vous pouvez utiliser malloc()
pour allouer dynamiquement le tampon pour chaque chaîne et copier dans ce tampon:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
BTW,
char (*a[2])[14];
Déclare a comme un tableau de 2 éléments de pointeurs vers des tableaux de 14 éléments de char.
char (*a[2])[14]
est un tableau de deux pointeurs vers un tableau de 14 caractères.