📅  最后修改于: 2023-12-03 15:00:54.536000             🧑  作者: Mango
在C/C++中,gets()
函数是比较常用的,也是被用得最多的输入函数。gets()
函数用于从标准输入stdin读取一行数据,直到遇到换行符或EOF为止,读取的内容存储到一个字符串指针所指向的字符数组中。
但是,gets()
函数存在一定的使用风险。如果用户输入的数据超出了指定字符数组的长度,那么就会导致内存缓冲区溢出的情况,这可能被黑客用来攻击你的程序。
为了防止gets()
函数带来的风险,我们建议使用fgets()
函数来代替gets()
函数。
char str[10];
fgets(str, 10, stdin);
和gets()
不同,fgets()
会接受第二个参数,用于表示读取字符数的最大值。我们可以限制最多只能读取10个字符。这样即使用户输入了一个长度超过10的字符串,程序也不会溢出。
使用fgets()
函数还可以更进一步地保障程序的安全性。一些编译器建议把fgets()
和sscanf()
等函数一起使用,以防止格式化字符串(format string)漏洞的出现。这种漏洞可以被黑客用来攻击你的程序。
char str[10];
fgets(str, 10, stdin);
int num;
sscanf(str, "%d", &num);
需要说明的是,fgets()
会读取字符串中的换行符,而sscanf()
则是用于字符串到数字的转换。在执行转换之前,sscanf()
会自动跳过开头的空格,所以即使用户输入了一些空格,也不会对程序运行产生影响。
综上所述,我们应该避免使用gets()
函数,而是使用更加安全的fgets()
函数来保障程序的安全。