Hacer una matriz para mantener matrices de matrices de caracteres en C

Mi C es un poco más que oxidada en este momento, así que no estoy creando algo que creo que debería ser bastante básico.

Permítanme referirme a matrices de caracteres como cadenas para esta publicación. Hará las cosas más claras para mí y para ti.

Lo que tengo es una matriz que puede contener 1 o más cadenas. Por ejemplo, {“ab”, “cd”, “ef”}. Quiero hacer otra matriz para almacenar varias versiones de la matriz de cadenas. Así que algo como {{“ab”, “cd”, “ef”}, {“gh”, “ij”}, {“kl”}}.

Lo que tengo ahora es:

char *arrayOfStrings[50]; // a single array to hold multiple strings char **arrayOfArraysOfStrings[10]; // array to hold multiple snapshots of arrayOfStrings 

La matriz de cadenas cambia con el tiempo y estoy usando la matriz de matrices de cadenas para básicamente contener instantáneas históricas de arrayOfStrings. Mi problema viene cuando necesito acceder a la matriz de instantáneas para datos. Este es el código que tengo que poner en la matriz de instantáneas:

 arrayOfArraysOfStrings[input_index] = arrayOfStrings; // you can assume input_index is updated correctly, I've already checked that. 

Esto parece ser incorrecto ya que cuando trato de acceder e imprimir el contenido de la matriz de instantáneas, solo imprime la información de las arrayOfStrings más recientes. La idea que buscaba con esto era almacenar la dirección de donde arrayOfChars está apuntando en una entrada de la matriz de instantáneas para que pueda acceder a ella más tarde.

En este momento, el acceso a una entrada en la matriz de instantáneas se realiza de la siguiente manera:

 arrayOfArraysOfChars[historicalIndex][indexOfTargetChar] 

Hay varias preguntas que busco responder:

  1. ¿Es el método que describí apropiado para lo que estoy tratando de hacer o hay una falla en mi lógica general?
  2. ¿Qué hago mal con mi código actual y cómo lo arreglo?
  3. ¿Hay una mejor manera de hacer esto? Si es así, ¿cómo funciona la inicialización de las matrices, la adición a las matrices y la lectura de las matrices?

–edit 4 / 18– Parte del problema es que estoy configurando los punteros en arrayOfArraysOfStrings para que apunten a lo mismo que arrayOfStrings apunta. Eso es malo ya que arrayOfStrings se edita. Necesito alguna forma de duplicar una matriz 2D … Preferiblemente, simplemente asignando un nuevo bloque de memoria para que arrayOfStrings señale.

Tienes demasiados punteros en tus dos arreglos.

 char arrayOfChars[50]; // a single array of characters char *arrayOfArraysOfChars[10]; // array to hold multiple single arrays of characters 

Dado que arrayOfChars se usa como un búfer (los nuevos datos siempre van allí primero), deberá guardar una copia de la cadena en arrayOfArrays. La función POSIX strdup debería ayudar aquí.

Aviso & y * son opuestos, entonces &* y *& no hacemos absolutamente nada.

También puedes hacer que arrayOfArrays literalmente eso.

 char arrayOfChars[50]; // a single array of characters char arrayOfArraysOfChars[10][50]; // array to hold multiple single arrays of characters 

Con esta configuración, debe usar strcpy para copiar los datos en arrayOfArrays.


Después de leer tu edición, creo que necesitas comenzar de una forma realmente simple. Y FWIW los nombres de las variables son el tipo incorrecto de húngaro.

Por lo que creo que estás tratando de hacer, comenzaría con una sola matriz de caracteres. Este será el búfer principal, para mantener las cadenas que se están ingresando y examinando.

 enum { BUFSZ = 50 }; char buf[BUFSZ + 1]; 

Entonces puedes usarlo con fgets o lo que sea.

 fgets(buf, BUFSZ, infile); 

Para guardarlos en una matriz, usaría strdup para su recorte automático. Si las cadenas van a tener una mayoría de 2 caracteres, no quiero que se utilicen 48 bytes adicionales para cada una. Por lo tanto, una serie de punteros char (cadenas).

 enum { STRVSZ = 40 }; char *strv[STRVSZ + 1]; int i; i = 0; strv[i] = strdup(buf); strv[i+1] = NULL; // This makes it an "argv-style" NULL-terminated array of strings ++i; // i is now the index of the next element, and a count of elements already added 

Cada elemento de strv es un puntero char. Pero para preservar nuestra cordura, intentamos abstraer un poco de ese detalle que nos distrae por un momento y tratar las cadenas como un tipo de datos separado.

Ahora para crear listas de estos, hacemos lo mismo otra vez. Pero no hay strdup función tipo- strdup para hacer un duplicado de una matriz de punteros, por lo que tenemos que separar la asignación y la copia.

 enum { STRVVSZ = 20 }; char **strvv[STRVVSZ + 1]; int j; j = 0; strvv[j] = calloc(i+1, sizeof *strvv[j]); // assuming i is the count of elements memcpy(strvv[j], strv, i * sizeof *strvv[j]); ++j; // j is now the index of the next string-pointer array in the array-of-same, // and a count of elements already added. 

Ahora, mis nombres son tan tontos como los tuyos, ¡pero son más cortos!

Debes aprender lo que significa una matriz. una matriz es básicamente un conjunto de entero o carácter o cualquier cosa . cuando esté almacenando un valor de carácter en una matriz, defínalo como,

 char array[] = {"somestringhere"}; 

ahora desea almacenar dichas matrices en otra matriz. Es simple:

 char* array1[]; 

La matriz1 almacenará valores, que son de tipo char* es decir, la dirección de las matrices de caracteres. Ahora desea almacenar estos en otra matriz,

 char** array2[]; 

esto es, matriz de [dirección de matrices] ahora, todo lo que tienes que hacer es;

 array1[0] = array; //same as: array1[0] = *array[0]; array2[0] = *array1[0]; 

Ahora tienes todo lo que necesitas. Espero que tengas claro, al núcleo. 🙂

Este ejemplo se realizó con turbo c + 1.01 dos y también funciona en la versión 3.0 dos.

 char * text[] = { "message1", "message2", "message3" }; 

Tenga en cuenta que sus ejemplos muestran matrices de punteros. Si desea matrices de matrices (matrices multidimensionales) especifique todos los tamaños en la definición de la matriz.

 char sentences[500][42]; /* sentences is an array of 500 elements. ** each element is itself an array ** capable of holding strings up to length 41 */ 

si se almacena texto en un archivo .c o .h con más de una línea de texto, equivalente a la idea de una matriz de matrices de caracteres. puede hacer esto:

 char * text[] = { "message1", "message2", "message3" }; 

también puede usar char * text [], char near * text [], char far * text [], char huge * text []. Tiene que tener un asterisco o un carácter de estrella para un puntero.

Se puede utilizar un bucle for para mostrar texto:

 char i; // int type can also be used for (i = 0, i < 3; i++) printf("%s\n", text[i]); 

otros bucles:

 char i = 0; // may not be zero when declared as "char i;" only while (i < 3) { printf("%s\n", text[i]); i++; } 

o

 char i = 0; // may not be zero when declared as "char i;" only do { printf("%s\n", text[i]); i++; } while (i < 3); 
    Intereting Posts