usar resueltos lenguaje leer funciones ejercicios ejemplos como caracteres cadenas cadena arreglo c input segmentation-fault scanf stdin

resueltos - funciones de cadenas de caracteres en c++



Lectura de una serie de cadenas en C (3)

Problema 1

Para almacenar una cadena de longitud 2, necesita una matriz de caracteres de tamaño 3. Utilice:

char array[n][3];

Problema 2

Está utilizando &tmp en la llamada a scanf . Eso está mal en dos cuentas.

  1. El tipo no es apropiado. El tipo de &tmp es char** . scanf necesita un char* con el especificador de formato %s .

  2. &tmp no puede contener una cadena.

Podrías usar

scanf("%s", tmp);

Eso estará bien desde el punto de vista del tipo, pero no funcionará desde el punto de vista del tiempo de ejecución, ya que tmp no apunta a nada válido.

Puede eliminar el tmp completo y usar:

scanf("%s", array[i]);

Ese bloque completo de código puede ser:

int n; scanf("%d", &n); char array[n][3]; for (int i = 0; i < n; i++) { // Make sure you don''t read more than 2 chars. scanf("%2s", array[i]); }

Necesito leer una matriz de n cadenas de 2 letras en cada una (por ejemplo, n = 3, necesito leer algo cerca de "ab bf cs"). Utilizo este código y obtengo un error de segmentación:

int n; scanf("%d", &n); char array[n][2]; char *tmp; for (int i = 0; i < n; i++) { scanf("%s", &tmp); strcpy(array[i], tmp); }

¡Por favor, ayúdame a arreglarlo!


Primero, como señaló user3121023 en los comentarios, char *tmp; crea un puntero sin memoria asignada. scanf () necesita una matriz, y necesita espacio para la terminación ''/0'' (que probablemente sea la fuente de su error de segmentación). Entonces podrías probar scanf("%s", array[i]); .

En segundo lugar, es una buena idea usar "%2s" lugar de "%s" para que el usuario no ingrese 3 dígitos y desborde su búfer.

Aquí hay una solución.

int n; scanf("%d", &n); char array[n][3]; for (int i = 0; i < n; i++) { scanf("%2s", array[i]); }


Hay un par de cosas que debes arreglar aquí.

  1. Recuerde que una "cadena" ( char[] ) siempre termina con un carácter de terminación nulo /0 . Entonces, cada vez que creas un char[] , debes dejar suficiente espacio para eso. Por ejemplo:

    char str[3] = "foo"; se parece a [''f'', ''o'', ''o''] , pero

    char str[4] = "foo"; se parece a [''f'', ''o'', ''o'', ''/0''] .

    Pueden ocurrir consecuencias inesperadas cuando se usa el primero.

    Esto significa que debe cambiar la char array[n][2] a la char array[n][3] .

  2. Recuerde que los punteros son diferentes a las matrices . Si desea utilizar un puntero, debe asignarle memoria, de lo contrario, probablemente segmente la falla.

    En su programa, es lo suficientemente simple como para poder salirse con la suya sin utilizar un puntero, especialmente dado que conoce la longitud de cada cuerda que va a almacenar (2).

    Puede cambiar char *tmp a char tmp[3] .

  3. En realidad, puede refactorizar su código para que no necesite la variable tmp en absoluto. Si lo desea, puede almacenar directamente la palabra que lee en la matriz. Por ejemplo:

    scanf("%s", array[n]);

  4. Si realmente insiste en usar esa variable tmp como un char * , entonces asigne memoria para ello, así:

    char *tmp = (char*)malloc(3 * sizeof(char));

  5. Como nota al margen, si se adhiere a los estándares ISO C90, no debe entremezclar declaraciones de variables en el código, por lo que en su ciclo donde tiene for(int i = 0...) , debe declarar int i; en la parte superior del archivo, y luego asignarlo en el ciclo for(i = 0...) .