Función de la biblioteca C -gets()
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.
- Tipo:
Descripción de la función
- Valor de retorno: Si tiene éxito, devuelve un puntero a
str. 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 en
strel 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
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:
#include <stdio.h>es el requisito previo para usargets()la función.char str[50];define un array de caracteres de longitud 50 para almacenar la cadena ingresada.gets(str);lee una línea de cadena desde la entrada estándar y la almacena enstrél.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
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 segura
fgets()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
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 tanto
gets()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
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.).
Otras extensiones