De man gets
:si uno se queja acerca de get(), ¿por qué no hacer lo mismo con scanf ("% s", ...)?
Nunca use gets(). Debido a que es imposible saber, sin conocer los datos de antemano cuántas caracteres gets() leerá, y porque gets() continuará almacenando caracteres más allá del final de la memoria intermedia, es extremadamente peligroso para su uso . Se ha usado para romper la seguridad de la computadora . Use fgets() en su lugar.
Casi en todas partes veo scanf
está utilizando en una forma que debería tener el mismo problema (buffer overflow/buffer overrun): scanf("%s",string)
. Este problema existe en este caso? ¿Por qué no hay referencias al respecto en la página del manual scanf
? ¿Por qué gcc no advierte al compilar esto con -Wall
?
PS: Sé que hay una forma de especificar en la cadena de formato de la longitud máxima de la cadena con scanf
:
char str[10];
scanf("%9s",str);
editar: No estoy pidiendo a Determe si el código anterior es correcto o no. Mi pregunta es: si scanf("%s",string)
siempre está mal, ¿por qué no hay advertencias y no hay nada al respecto en la página de manual?
El enlace de su wikipedia dice 'scanf' es * inseguro *. – aviraldg
@aviraldg Tienes razón y lo he leído antes, pero no encontraba una manera agradable de escribir el título. Lo edité – dbarbosa
Como todos respondieron: 'scanf ("% s ", ...)' no es seguro. Una referencia más sobre esto: http://c-faq.com/stdio/scanfprobs.html. Todavía no entiendo cómo no hay nada sobre esto en la página del manual. – dbarbosa