1. 主页
  2. 文档
  3. C语言教程
  4. C语言数组和字符串
  5. gets() 使用起来有风险

gets() 使用起来有风险

考虑下面的程序。 

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

代码看起来很简单,它从标准输入中读取字符串并打印输入的字符串,但是由于gets() 没有进行任何数组绑定测试,因此存在缓冲区溢出问题。gets() 继续读取,直到它看到一个换行符。 
为避免缓冲区溢出,应使用 fgets() 而不是 gets(),因为 fgets() 确保读取的字符不超过 MAX_LIMIT 个。

#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’。

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

int len = strlen(str);

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

 

这篇文章对您有用吗?