gets
no es seguro porque le da un búfer, pero no le dice qué tan grande es el búfer. La entrada puede escribir más allá del final del búfer, explotando su programa de manera espectacular. Usando fgets
lugar es un poco mejor, ya que dice que el tamaño del búfer es, de esta manera:
const int bufsize = 4096; /* Or a #define or whatever */
char buffer[bufsize];
fgets(buffer, bufsize, stdin);
... así siempre y cuando se da la información correcta, no escribe más allá del final del búfer y explotar las cosas.
Ligeramente OT, pero:
Usted no tiene que utilizar un const int
para el tamaño del búfer, pero lo haría fuertemente recomendamos que no sólo hay que poner un número literal en ambos lugares, ya que inevitablemente Cambiará uno pero no el otro más tarde. El compilador puede ayudar:
char buffer[4096];
fgets(buffer, (sizeof buffer/sizeof buffer[0]), stdin);
Esa expresión se resuelve en tiempo de compilación, no en tiempo de ejecución. Es un dolor que escribir, así que solía utilizar una macro en mi juego habitual de los encabezados:
#define ARRAYCOUNT(a) (sizeof a/sizeof a[0])
... pero estoy un par de años de retraso con mi C puro, es probable que haya una mejor manera estos días.
Es una función insegura; Se pueden emitir ataques de desbordamiento de búfer si los programas usan funciones que no ofrecen la posibilidad de verificar el tamaño del búfer – INS
Si uso scanf() en lugar de gets() funciona, pero tengo que leer 2 entradas del teclado y el programa se detiene después de leer el primero. ¿Por qué? este es el código: usuario de char; pase de char; printf ("Iser ID"); scanf ("% s", usuario); printf ("Código PIN:"); scanf ("% s", pase); – Peiska
@peiska: el programa se detiene después del primero porque está esperando que ingrese el segundo. Tú mismo pones ese segundo 'scanf' allí. ¿Por qué te sorprende que el programa "pare" entonces? – AnT