Namespaces
Variants

gets, gets_s

From cppreference.net
< c ‎ | io
Definido en el encabezado <stdio.h>
char * gets ( char * str ) ;
(1) (eliminado en C11)
char * gets_s ( char * str, rsize_t n ) ;
(2) (desde C11)
1) Lee desde stdin hacia el arreglo de caracteres apuntado por str hasta que se encuentra un carácter de nueva línea o ocurre fin de archivo. Un carácter nulo se escribe inmediatamente después del último carácter leído en el arreglo. El carácter de nueva línea se descarta pero no se almacena en el búfer.
2) Lee caracteres desde stdin hasta que se encuentra una nueva línea o ocurre fin de archivo. Escribe como máximo n - 1 caracteres en el array apuntado por str , y siempre escribe el carácter nulo terminador (a menos que str sea un puntero nulo). El carácter de nueva línea, si se encuentra, se descarta y no cuenta hacia el número de caracteres escritos en el buffer.
Los siguientes errores se detectan en tiempo de ejecución y llaman a la función constraint handler actualmente instalada:
  • n es cero;
  • n es mayor que RSIZE_MAX ;
  • str es un puntero nulo;
  • endline o eof no encontrados después de almacenar n - 1 caracteres en el buffer.
En cualquier caso, gets_s primero termina de leer y descartar los caracteres de stdin hasta el carácter de nueva línea, condición de fin de archivo, o error de lectura antes de llamar al manejador de restricciones.
Como con todas las funciones con verificación de límites, gets_s solo está garantizada su disponibilidad si __STDC_LIB_EXT1__ está definida por la implementación y si el usuario define __STDC_WANT_LIB_EXT1__ como la constante entera 1 antes de incluir <stdio.h> .

Contenidos

Parámetros

str - un arreglo de caracteres al que se escribirán los caracteres desde stdin
n - número máximo de caracteres que pueden escribirse en el arreglo apuntado por str

Valor de retorno

str en caso de éxito, un puntero nulo en caso de fallo.

Si el fallo ha sido causado por una condición de fin de archivo, establece adicionalmente el indicador eof (ver feof() ) en stdin . Si el fallo ha sido causado por algún otro error, establece el indicador error (ver ferror() ) en stdin .

Notas

La función gets() no realiza verificación de límites, por lo tanto esta función es extremadamente vulnerable a ataques de desbordamiento de búfer. No puede usarse de forma segura (a menos que el programa se ejecute en un entorno que restrinja lo que puede aparecer en stdin ). Por esta razón, la función ha sido desaprobada en el tercer corregendum del estándar C99 y eliminada por completo en el estándar C11. fgets() y gets_s() son los reemplazos recomendados.

ADVERTENCIA: Nunca uses gets() .

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • K.3.5.4.1 La función gets_s (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • K.3.5.4.1 La función gets_s (p: TBD)
  • Estándar C11 (ISO/IEC 9899:2011):
  • K.3.5.4.1 La función gets_s (p: 602-603)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 7.19.7.7 La función gets (p: 298)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 4.9.7.7 La función gets

Véase también

lee entrada formateada desde stdin , un flujo de archivo o un búfer
(función)
obtiene una cadena de caracteres desde un flujo de archivo
(función)
escribe una cadena de caracteres a un flujo de archivo
(función)
lee desde un flujo hacia un búfer de tamaño automático hasta delimitador/fin de línea
(función)