gets() es arriesgado de usar!

Considere el siguiente programa. 

C

void read()
{
   char str[20];
   gets(str);
   printf("%s", str);
   return;
}

El código parece simple, lee la string de la entrada estándar e imprime la string ingresada, pero sufre un desbordamiento de búfer ya que gets() no realiza ninguna prueba de límite de array. gets() sigue leyendo hasta que ve un carácter de nueva línea. 
Para evitar el desbordamiento de búfer, se debe usar fgets() en lugar de gets(), ya que fgets() se asegura de que no se lean más de MAX_LIMIT caracteres.

C

#define MAX_LIMIT 20
void read()
{
   char str[MAX_LIMIT];
   fgets(str, MAX_LIMIT, stdin);
   printf("%s", str);
 
   getchar();
   return;
}

NOTA: fgets() almacena el carácter ‘\n’ si se lee, por lo que el programador debe eliminarlo explícitamente. Por lo tanto, generalmente se recomienda que su str pueda almacenar al menos (MAX_LIMIT + 1) caracteres si su intención es mantener el carácter de nueva línea. Esto se hace para que haya suficiente espacio para agregar el carácter de terminación nulo ‘\0’ al final de la string.

Si no se pretende mantener el carácter de nueva línea, simplemente se puede hacer lo siguiente:

C

int len = strlen(str);
 
// Remove the '\n' character and replace it with '\0'
str[len - 1] = '\0';

Siéntase libre de leer más sobre gets() y fgets() aquí .

Escriba comentarios si encuentra algo incorrecto en el artículo anterior o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *