Tengo una matriz 2D de char * creada así:

char *rows[][4] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
};

Entonces quiero cambiar un carácter en esta matriz. Con mi limitada experiencia lo haría así:

rows[0][0][0] = 'G';

Y espero que el "A1" cambie a "G1". En cambio, obtengo una falla de Seg. Cómo hago esto ?

1
Adream 12 oct. 2020 a las 19:46

2 respuestas

La mejor respuesta

Esta declaración

char *rows[][4] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
};

Declara una matriz multidimensional de punteros a cadenas literales.

No puede cambiar un literal de cadena. Cualquier intento de cambiar un literal de cadena da como resultado un comportamiento indefinido.

Del estándar C (literales de cadena 6.4.5)

7 No se especifica si estas matrices son distintas siempre que su los elementos tienen los valores adecuados. Si el programa intenta modificar dicha matriz, el comportamiento no está definido

Declare la matriz de cadenas de la siguiente manera

char rows[][4][3] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
};

Preste atención a eso, ya que la segunda dimensión de la matriz es igual a 4 mientras que especificó solo tres inicializadores para las submatrices, la declaración se ve así

char rows[][4][3] = {
    {"A1","A2","A3", ""},
    {"B1","B2","B3", ""}
};

Ahora puedes escribir

rows[0][0][0] = 'G';
0
Vlad from Moscow 12 oct. 2020 a las 17:05

Si sabe que todas las cadenas tendrán una longitud de 2, puede usar esto:

  char rows[2][3][3] = {
    {"A1","A2","A3"},
    {"B1","B2","B3"}
  };
  printf("%c\n", rows[0][0][0]); //Prints "A"
  printf("%s\n", rows[0][0]); //Prints "A1"

  rows[0][0][0] = 'G';

  printf("%c\n", rows[0][0][0]); //Prints "G"
  printf("%s\n", rows[0][0]); //Prints "G1"

Tenga en cuenta que necesita filas [2] [3] [3] en lugar de filas [2] [3] [2] cuando la cadena es de longitud 2 porque en c cada cadena termina con el carácter '\ 0'.

Si desea admitir cadenas de diferentes tamaños, también puede crear sus cadenas utilizando malloc. Avísame si quieres más detalles sobre esto.

0
Christian Doucette 12 oct. 2020 a las 17:06