cómo obtener las longitudes de cadena almacenadas en la matriz (C)

  1. ¿Cómo obtendría las longitudes de las cadenas debajo, así como el tamaño de la matriz?

    char str [] = {};

    str[0] = "He"; str[1] = "llo"; str[2] = " Wor"; str[3] ="ld"; 
  2. ¿Y cómo podría almacenarlos en una matriz multidimensional? Así que esta matriz se vería algo como esto:

    char strstr [tamaño de str] [longitud de cadena de str];

El strstr[][] array-dimensiones debe ser
1.número de elementos-matriz de str y
2.número de todos los caracteres en str . En el caso de strstr[3][1] , esto sería ” d “.
¿Sería eso posible sin inicializar el str -array en primer lugar?

[editar] Ya veo, la segunda dimensión de strstr no tiene sentido. Debe ser la longitud de cada elemento desde *str y no el número completo de caracteres en *str [/ edit]

Esto probablemente hará lo que quieras, pero no fue exactamente lo que pediste.

 #include  char *strs[] = { "foo", "bar", "bazy" }; int main() { printf("%d - %s\n", strlen(strs[0]), strs[0]); printf("%d - %s\n", strlen(strs[1]), strs[1]); printf("%d - %s\n", strlen(strs[2]), strs[2]); return 0; } 

Salida :

 3 - foo 3 - bar 4 - bazy 

Tenga en cuenta que solo tiene unas pocas posibilidades para almacenar matrices de matrices. Puede hacer lo que hace esta solución (hacer una matriz de punteros a matrices), hacer una lista “comprimida” de matrices en una matriz grande, o hacer una matriz 2D demasiado grande.


La matriz “comprimida” tomaría el formato:

 char strs[] = "foo\0bar\0bazy"; // array is {f,o,o,\0,b,a,r,\0,b,a,z,y,\0} 

El problema con este formato es que es un poco difícil acceder a cualquier cosa después del primer elemento, y generalmente implica buscar linealmente a través de la matriz. (o manteniendo una tabla de direcciones separada … como la primera solución)


La matriz 2-D requiere que especifique todos los tamaños, y se ve así:

 char strs[3][5] = { "foo", "baz", "baxy" }; int main() { printf("%d - %s\n", strlen(strs[0]), strs[0]); printf("%d - %s\n", strlen(strs[1]), strs[1]); printf("%d - %s\n", strlen(strs[2]), strs[2]); return 0; } 

Esto probablemente se presenta en la memoria de esta manera:

 {f,o,o,\0,*,b,a,z,\0,*,b,a,x,y,\0} (the *'s could be anything, most dependent on your compiler) 

Como el comstackdor sabe que cada cadena toma exactamente 5 bytes, puede calcular fácilmente la ubicación de los elementos posteriores.

Al declarar una matriz en C, debe declarar su tamaño a menos que esté proporcionando simultáneamente valores de inicialización. Esto se debe a que los arreglos se distribuyen de forma secuencial en la memoria, por lo que la computadora necesita saber cuánto espacio debe reservar.

Además, char str [] = {....} declarará una matriz de caracteres , no una matriz de cadenas . Una cadena es una matriz de caracteres, por lo que str es una sola cadena.

Para crear una matriz de cadenas, debes hacer algo como esto:

 char strs[num_of_strings][max_length_of_strings+1]; strcpy(strs[0],"string1"); strcpy(strs[1],"string2"); ... 

Hay una discusión más profunda de otras opciones en esta pregunta .

Si está especificando max_length_of_strings pero luego las copias de las cadenas fuente que no puede garantizar son más cortas que max_length_of_strings , desea usar strncpy lugar de strcpy . En ese caso, también desea asegurarse de que las cadenas resultantes estén terminadas en nulo, lo que puede hacer haciendo un bucle

 strs[i][max_length_of_strings] = '\0'; 

Para obtener la longitud de una cadena terminada en nulo, use la función strlen .

En cuanto a la segunda parte de su pregunta, lo anterior debe aclarar cómo crear una matriz de mayor dimensión. Proporcionaría más detalles, pero no estoy exactamente seguro de lo que quiere que haga esta matriz. Cuando dices “número de todos los caracteres en str”, ¿te refieres a la longitud máxima de las cadenas almacenadas en la matriz de strs ?

Si es así, no tienes que preocuparte por eso. Progtwigr la matriz de strs como lo expliqué anteriormente ya le dará esta funcionalidad: como las cadenas son solo matrices de char , puede indexar en cadenas de la misma manera que indexa en char .

Avíseme si algo de lo anterior no está claro, e intentaré explicarlo mejor.

Si quieres una matriz real, algo como esto:

  char str[4][5]; // holds up to 4 characters in each strcpy(str[0], "He"); strcpy(str[1], "llo"); strcpy(str[2], " Wor"); strcpy(str[3], "ld"); 

Para obtener la longitud de una cadena en C, strlen y strlen la cadena.

 int len = strlen(array[0]);