gets()
函数是 C 语言中的一个历史遗留函数,用于从标准输入(通常是键盘)读取一行文本,并将其存储到指定的字符数组中。然而,使用 gets()
函数时需要注意以下几点:
gets()
函数不进行边界检查,它会将输入的文本一直读取到遇到换行符或EOF为止。这可能导致缓冲区溢出,从而引发安全漏洞。例如,如果数组只分配了 5 个字符的空间,但用户输入了 10 个字符,那么多余的字符将会覆盖数组的其他部分,甚至可能覆盖其他变量的值。这种缓冲区溢出的风险在 scanf()
函数中也存在,但由于 gets()
不检查缓冲区大小,因此其风险更为严重。gets()
函数的安全性问题,C11 标准已经将其废弃(deprecated),并在 C17 标准中被移除。现代 C 语言编程中建议使用 fgets()
函数代替 gets()
。fgets()
函数允许指定接收字符串的最大长度,从而有效防止缓冲区溢出。gets()
函数的简单示例,但请注意,在实际编程中应避免使用该函数。#include <stdio.h>
int main() {
char buffer[10];
printf("Enter a string: ");
gets(buffer); // 不安全的操作,可能导致缓冲区溢出
printf("You entered: %s", buffer);
return 0;
}
fgets()
函数可以更安全地读取字符串。下面是一个使用 fgets()
的示例:#include <stdio.h>
int main() {
char buffer[10];
printf("Enter a string (max 9 characters): ");
fgets(buffer, sizeof(buffer), stdin); // 更安全的操作
buffer[strcspn(buffer, "\n")] = 0; // 去除换行符
printf("You entered: %s", buffer);
return 0;
}
在这个示例中,fgets()
函数限制了最多读取 9 个字符(加上一个终止字符 \0
),从而避免了缓冲区溢出的风险。同时,使用 strcspn()
函数去除了输入字符串末尾的换行符。