[C con Clase] Duda con el gets();
Steven Davidson
srd4121 en njit.edu
Lun Feb 16 02:15:04 CET 2009
Hola Javier,
Javier Cancio del Busto wrote:
> Buenas,
>
> Estoy haciendo un programa, en el cual tengo una función que debe
> leer una línea de consola, de, como máximo, 200 caracteres. El caso
> es que declaro un char *linea; y hago gets(linea); y al compilar (me
> compila y ejecuta bien el código) me da un warning que no entiendo
> por qué me lo da, y es el siguiente:
>
Si estás pasando el puntero 'linea' directamente a 'gets()' y te ha
funcionado correctamente, entonces has tenido muchísima suerte. En
realidad, estás cometiendo un error si has escrito esto:
char *linea;
gets( linea );
'linea' no es nada más que un puntero, que inicialmente apuntará a una
dirección de memoria arbitraria. Posteriormente, asignas datos a partir
de dirección de memoria. Esto puede provocar un error en tiempo de
ejecución o incluso peor: no mostrar ningún mensaje.
Deberías crear memoria dinámicamente o declarar un array (estático).
Esto es,
char szCadena[200];
char *linea = (char*) malloc( 200 );
> [sepho en arch pr_shell_alumno]$ make
> gcc ush.c profe_32.a analizador.o redireccion.o ejecucion.o -o ush
> /tmp/ccUPiwYV.o: In function `leerLinea':
> ush.c:(.text+0x15f): warning: the `gets' function is dangerous and
> should not be used.
> strip ush
>
El mensaje es un aviso. No deberías usar 'gets()' porque no tiene en
cuenta la cantidad máxima del array. Esto implica que puede sobrepasar
las limitaciones y sobreescribir memoria que pertenezca a otras
variables o incluso a otros programas.
Puedes usar 'fgets()', aunque te guardará el carácter de fin-de-línea,
'\n' en la cadena. Por ejemplo,
fgets( szCadena, 200, stdin );
También puedes usar 'scanf()'. Esto sería,
scanf( "%199s", szCadena );
Espero haber aclarado las dudas.
Steven
Más información sobre la lista de distribución Cconclase