[C con Clase] Duda con el gets();

Javier Cancio del Busto sepholin en gmail.com
Lun Feb 16 02:32:52 CET 2009


Muchas gracias por la aclaración :)

Me quedo con fgets() ya que lo que necesito tambien es almacenar el \n
final. Muchas gracias

El 16 de febrero de 2009 2:15, Steven Davidson <srd4121 en njit.edu> escribió:

> 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
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
=====================
  Javier Cancio del Busto
=====================
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20090216/d4f0a81c/attachment.html>


Más información sobre la lista de distribución Cconclase