📜  gets()有使用风险!

📅  最后修改于: 2021-05-26 03:09:44             🧑  作者: Mango

考虑下面的程序。

C
void read()
{
   char str[20];
   gets(str);
   printf("%s", str);
   return;
}


C
#define MAX_LIMIT 20
void read()
{
   char str[MAX_LIMIT];
   fgets(str, MAX_LIMIT, stdin);
   printf("%s", str);
 
   getchar();
   return;
}


C
int len = strlen(str);
 
// Remove the '\n' character and replace it with '\0'
str[len - 1] = '\0';


该代码看起来很简单,它从标准输入中读取字符串并打印输入的字符串,但是由于get()没有进行任何数组绑定测试,因此它遭受了缓冲区溢出的困扰。得到()不断阅读,直到它看到一个字符。
为避免缓冲区溢出,应使用fgets()代替gets(),因为fgets()确保读取的字符不能超过MAX_LIMIT个。

C

#define MAX_LIMIT 20
void read()
{
   char str[MAX_LIMIT];
   fgets(str, MAX_LIMIT, stdin);
   printf("%s", str);
 
   getchar();
   return;
}

注意: fgets()如果读取了’\ n’字符,则该字符必须由程序员明确地删除。正是因此,通常建议您STR可以存储至少(MAX_LIMIT + 1)的字符,如果你的目的是要保持字符。这样做是为了在字符串末尾有足够的空间添加空终止字符’\ 0’。

如果保持字符无意,那么可以简单地作出以下

C

int len = strlen(str);
 
// Remove the '\n' character and replace it with '\0'
str[len - 1] = '\0';

请随时在此处阅读有关gets()和fgets()的更多信息。

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。