gets
函数的定义
gets
函数用于从标准输入(通常是键盘)读取一行字符串。它的函数原型如下:

- 其中,参数
s
是一个字符指针,指向用于存储输入字符串的字符数组。
gets
函数的使用方法
- 当调用
gets
函数时,它会一直读取字符,直到遇到换行符\n
为止。然后它会将换行符替换为字符串结束标志\0
,并返回指向输入字符串的指针(也就是参数s
)。 - 例如:
#include <stdio.h>
int main() {
char str[100];
printf("Enter a string: ");
gets(str);
printf("You entered: %s\n", str);
return 0;
}
- 在这个例子中,用户输入的字符串会被
gets
函数读取并存储在str
数组中,然后再被打印出来。
gets
函数的安全问题
gets
函数存在严重的安全隐患,它不会检查输入字符串的长度,这可能导致缓冲区溢出。- 例如,如果定义了一个长度为 10 的字符数组,而用户输入了超过 10 个字符的字符串,
gets
函数会继续向内存中写入数据,可能会覆盖其他重要的数据,导致程序崩溃甚至被恶意利用(如栈溢出攻击)。 - 由于这个安全问题,
gets
函数在新的 C 标准(如 C11)中已经被弃用。取而代之的是更安全的函数,如fgets
。
fgets
与gets
的对比
char *fgets(char *s, int size, FILE *stream);
- 其中,
s
是存储输入字符串的字符数组,size
是要读取的最大字符数(包括字符串结束标志\0
),stream
是输入流(通常为stdin
表示标准输入)。 fgets
会读取最多size - 1
个字符(为\0
留出空间),或者读到换行符\n
为止。这样就避免了缓冲区溢出的问题。例如:
#include <stdio.h>
int main() {
char str[10];
printf("Enter a string: ");
fgets(str, sizeof(str), stdin);
printf("You entered: %s", str);
return 0;
}
- 在这个例子中,
fgets
最多会读取10 - 1 = 9
个字符,防止了缓冲区溢出。