Hay varias formas de crear una matriz de cadenas en C. Si todas las cadenas van a tener la misma longitud (o al menos tendrán la misma longitud máxima), simplemente declare una matriz 2D de caracteres y asigne según sea necesario:
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");
También puede agregar una lista de inicializadores:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Esto supone que el tamaño y el número de cadenas en el inicializador coinciden con las dimensiones de su matriz. En este caso, el contenido de cada literal de cadena (que en sí mismo es una matriz de caracteres terminados en cero) se copia en la memoria asignada a las cadenas. El problema con este enfoque es la posibilidad de fragmentación interna; si tiene 99 cadenas de 5 caracteres o menos, pero 1 cadena de 20 caracteres de longitud, 99 cadenas tendrán al menos 15 caracteres no utilizados; Eso es una pérdida de espacio.
En lugar de usar una matriz 2-d de char, puede almacenar una matriz 1-d de punteros para char:
char *strs[NUMBER_OF_STRINGS];
Tenga en cuenta que en este caso, solo ha asignado memoria para mantener los punteros a las cadenas; la memoria para las propias cadenas debe asignarse a otra parte (ya sea como matrices estáticas o usando malloc()
o calloc()
). Puede usar la lista de inicializadores como en el ejemplo anterior:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
En lugar de copiar el contenido de las constantes de cadena, simplemente está almacenando los punteros a ellas. Tenga en cuenta que las constantes de cadena pueden no ser grabables; puede reasignar el puntero, así:
strs[i] = "bar";
strs[i] = "foo";
Pero es posible que no pueda cambiar el contenido de la cadena; es decir,
strs[i] = "bar";
strcpy(strs[i], "foo");
puede no estar permitido
Puede usar malloc()
para asignar dinámicamente el búfer para cada cadena y copiar a ese búfer:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
Por cierto,
char (*a[2])[14];
Declara a como una matriz de punteros de 2 elementos a matrices de 14 elementos de char.
char (*a[2])[14]
es una matriz de dos punteros a una matriz de 14 caracteres.