gets()使用起来有风险!

考虑下面的程序。

null

C

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


代码看起来很简单,它从标准输入中读取字符串并打印输入的字符串,但它会受到 缓冲区溢出 as get()不做任何数组绑定测试。get()继续读取,直到看到换行符。 为了避免缓冲区溢出,应该使用fgets()而不是get(),因为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()存储’字符,因此必须由程序员明确地删除它。因此,一般建议您的str可以存储至少(MAX_LIMIT+1)个字符,如果您打算保留换行符。这样就有足够的空间将空终止字符“”添加到字符串的末尾。

如果不打算保留换行符,那么可以简单地执行以下操作-

C

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


请随意阅读更多关于gets()和fgets()的信息 在这里 .

如果您发现上述文章中有任何不正确之处,或者您想分享有关上述主题的更多信息,请发表评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享