[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