Dividir una matriz de cadenas en función del carácter.

Tengo una serie de cadenas similares a esto:

char* arrStrings[] = {"a", "be", "|", "cgg", "dss", "|", "mmd", "ddd", "\0"} 

1) Me gustaría poder dividir esto en un conjunto de matrices, en función de donde ‘|’ el personaje es.

Entonces, después de dividir, tendría esto:

 a1 = {"a", "be", "\0"} a2 = {"cgg", "dss", "\0"} a3 = {"mmd", "ddd", "\0"} 

2) Después de eso, necesito crear una lista vinculada que tenga las 3 matrices, como esta:

 list = {pointer to a1, pointer to a2, pointer to a3} 

Estoy muy confundido al respecto, ya que hay múltiples niveles de punteros involucrados. ¿Cómo puedo lograr esto?

Si puede usar NULL como delimitador en la lista, no necesita duplicar las cadenas, solo use una matriz de punteros a la cadena.

 *arrStrings[] = {"a", "be", "|", "cgg", "dss", "|", "mmd", "ddd", ""}; 

se transforma en

 *arr [] = {"a", "be", NULL, "cgg", "dss", NULL, "mmd", "ddd", NULL}; 

Una vez que haya llenado la matriz, puede utilizar una matriz de punteros para apuntar a cadena para crear la lista:

 *arr [] = {"a", "be", NULL, "cgg", "dss", NULL, "mmd", "ddd", NULL}; **ptr [] = { ^ ^ ^ }; 

 #include  #include  #include  int main(void) { /* The array */ char *arrStrings[] = {"a", "be", "|", "cgg", "dss", "|", "mmd", "ddd", ""}; /* Elements of the array */ size_t sz = sizeof(arrStrings) / sizeof(arrStrings[0]); /* Loop */ size_t i, n = 0; /* Create an array (VLA) of n pointers */ char *arr[sz]; /* Count the number of delimiters and fill array */ for (i = 0; i < sz; i++) { /* If we found a delimiter assign NULL */ if (strcmp(arrStrings[i], "|") == 0) { arr[i] = NULL; n++; } else /* If we found an empty string assign NULL */ if (arrStrings[i][0] == '\0') { arr[i] = NULL; } else { arr[i] = arrStrings[i]; } } /* Create an array (VLA) of n delimiters pointers to pointer */ char **ptr[n + 1]; ptr[0] = &arr[0]; for (i = n = 0; i < sz - 1; i++) { /* For each NULL string push address of array + 1 into ptr */ if (arr[i] == NULL) { ptr[++n] = &arr[i + 1]; } } /* For each pointer to pointer loop and print until NULL */ char **str; for (i = 0; i <= n; i++) { str = ptr[i]; printf("%zu)\n", i); while (*str != NULL) { printf("\t%s\n", *str); str++; } } return 0; } 

Salida:

 0) a be 1) cgg dss 2) mmd ddd 

Lo primero que debes saber es que una matriz de cadenas es un puntero a un número fijo de punteros a caracteres adicionales

 arrString --> |_|_|_| ... |_| | | | | VVVV ab | \0 e 

por lo tanto, no puede simplemente actualizar el “|” Elemento con “\ 0” y administre la cadena como sería la función “strtok” por ejemplo. En su lugar, debe asignar tres nuevas matrices “char **” para mantener las tres secuencias “char *” y usarlas para crear la lista como prefiera.

En caso de que quiera evitar la asignación de nuevo espacio de memoria, debe implementar instalaciones personalizadas para analizar la matriz “char **” de acuerdo con su formato. De esta manera, realmente puede tener tres punteros a tres posiciones diferentes en “arrString”, que definen la primera subcadena que pertenece a la matriz interesada. El elemento final “|” o “\ 0” indicará que no le pertenecen más elementos. Sin embargo, como ya dije, esto requiere que implemente funciones ad-hoc, que evitan alterar la matriz.