Función de la biblioteca C -gets()

C 标准库 - <stdio.h>Biblioteca estándar de C - <stdio.h>


En el lenguaje C,gets()es una función clásica para leer cadenas desde la entrada estándar. Aunque su uso es simple, se debe prestar atención a los problemas de seguridad.

gets()La función, desdela entrada estándar stdin,lee una línea de cadena y la almacena en el array de caracteres especificado. Lee caracteres hasta encontrar un salto de línea o el final del archivo.

Advertencia importante:gets()Presenta graves vulnerabilidades de seguridad: no se puede especificar el tamaño del búfer, lo que fácilmente causa desbordamiento del búfer. Por lo tanto, en la programación moderna en C,fgets()es una mejor opción.

Definición de la palabra:getsignifica "obtener",srepresenta "cadena" (string), y juntos significan "obtener cadena".


Sintaxis básica y parámetros

gets()es una función de la biblioteca estándar de C, y requiere incluir el archivo de cabecera<stdio.h>。

Formato de sintaxis

char *gets(char *str);

Descripción de parámetros

  • Parámetro: str
    • Tipo:char *(puntero a un array de caracteres)
    • Descripción: Un puntero a un array de caracteres, que se utiliza para almacenar la cadena C leída. Hay que asegurarse de que el array sea lo suficientemente grande como para contener la cadena ingresada.

Descripción de la función

  • Valor de retorno: Si tiene éxito, devuelve un puntero astr. Si se produce un error o se llega al final del archivo sin haber leído ningún carácter, devuelveNULL。
  • Efecto: La cadena leída (sin incluir el salto de línea) se almacena enstrel array al que apunta, y al final se añade automáticamente el carácter nulo\0como marcador de fin de cadena.

Ejemplo

Aprendamos mediante ejemplosgets()el uso de.

Ejemplo 1: Uso básico - Leer una cadena

Ejemplo

#include <stdio.h>

int main()
{
   char str[50];

   printf("Por favor, ingrese una cadena:");
   gets(str);

   printf("La cadena que ingresó es: %s", str);

   return(0);
}

Resultado esperado de la ejecución:

请输入一个字符串:ejemplo
您输入的字符串是:ejemplo

Análisis del código:

  1. #include <stdio.h>es el requisito previo para usargets()la función.
  2. char str[50];define un array de caracteres de longitud 50 para almacenar la cadena ingresada.
  3. gets(str);lee una línea de cadena desde la entrada estándar y la almacena enstrél.
  4. printf("您输入的字符串是:%s", str);Usa%sel especificador de formato para generar la cadena.

Ejemplo 2: Manejo del caso en que el valor de retorno es NULL

En la programación real, se debe comprobargets()el valor de retorno, para manejar posibles errores.

Ejemplo

#include <stdio.h>

int main()
{
   char str[100];
   char *result;

   printf("Ingrese algún contenido (presione Ctrl+D para finalizar):\n"\n");
   result = gets(str);

   if (result != NULL) {
       printf("Lectura exitosa, el contenido es:\n"\n%s\n", str);
   } else {
       printf("¡Error de lectura o se ha alcanzado el final del archivo!\n"\n");
   }

   return(0);
}

Análisis del código:

  • gets()devuelve un puntero a la misma cadena; si falla, devuelveNULL。
  • cuando el usuario presiona Ctrl+D (Linux/Mac) o Ctrl+Z (Windows), se activa la condición de fin de archivo,gets()devuelveNULL。
  • En proyectos reales, se recomienda usar la más segurafgets()en lugar degets()。

Ejemplo 3: Problemas de seguridad de gets() (⚠️ Demostración de operación peligrosa)

El siguiente ejemplo muestra por quégets()no es seguro.

Ejemplo

#include <stdio.h>

int main()
{
   // Nota: ¡este ejemplo es muy peligroso, solo se usa para demostración!
   char buffer[10];

   printf("Ingrese una cadena más larga (más de 10 caracteres):\n"\n");
   gets(buffer);  // Sin verificación de límites, puede provocar desbordamiento del búfer

   printf("Lo que ingresó es: %s\n"\n", buffer);

   return(0);
}

Análisis del código:

  • buffer[10]solo se asignaron 10 bytes de espacio.
  • Si el usuario ingresa una cadena de más de 9 caracteres (incluyendo el carácter\0del final), se producirádesbordamiento del búfer, que puede sobrescribir áreas de memoria adyacentes.
  • Esto puede ser aprovechado por atacantes para ejecutar código malicioso, por lo tantogets()en el estándar C99 ya fue marcada como obsoleta, y en el estándar C11 fue eliminada.

Mejor alternativa: fgets()

Se recomienda encarecidamente usarfgets()en lugar degets(), ya que permite especificar el tamaño del búfer.

Ejemplo

#include <stdio.h>

int main()
{
   char str[50];

   printf("Ingrese una cadena:");
   // fgets(búfer, tamaño del búfer, flujo de archivo)
   fgets(str, sizeof(str), stdin);

   // Eliminar el salto de línea leído por fgets
   // Método: buscar el salto de línea y reemplazarlo por el carácter nulo
   for (int i = 0; str[i] != '\0'; i++) {
       if (str[i] == '\n') {
           str[i] = '\0';
           break;
       }
   }

   printf("La cadena que ingresó es: %s\n"\n", str);

   return(0);
}

fgets()Las ventajas de:

  • Se puede especificar el número máximo de caracteres a leer, evitando el desbordamiento del búfer.
  • Conserva el salto de línea al final de la cadena (se puede eliminar manualmente si es necesario).
  • Se puede especificar la fuente de entrada (entrada estándar, archivos, etc.).

C 标准库 - <stdio.h>Biblioteca estándar de C - <stdio.h>

Otras extensiones