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.
El tipo no es apropiado. El tipo de
&tmp
eschar**
.scanf
necesita unchar*
con el especificador de formato%s
.&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í.
Recuerde que una "cadena" (
char[]
) siempre termina con un carácter de terminación nulo/0
. Entonces, cada vez que creas unchar[]
, debes dejar suficiente espacio para eso. Por ejemplo:char str[3] = "foo";
se parece a[''f'', ''o'', ''o'']
, perochar 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 lachar array[n][3]
.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
achar tmp[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]);
Si realmente insiste en usar esa variable
tmp
como unchar *
, entonces asigne memoria para ello, así:char *tmp = (char*)malloc(3 * sizeof(char));
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 declararint i;
en la parte superior del archivo, y luego asignarlo en el ciclofor(i = 0...)
.