今天在写测试代码时,使用了gets函数来获取输入的字符串,结果出现了异常警告:
gets函数危险的地方在于:它不知道缓冲区有多大,它会一直读取数据放到缓冲区,直到出现换行符(’\n’)或者遇到EOF才会停止。这样很容易造成缓冲区的溢出。
使用fgets可以避免缓冲区异常的危险,但是却将换行符’\n’,也读入到字符串中,因此需要对fgets函数进行封装(wrapper)。
char buffer[BUFSIZ];
while (fgets(buffer, sizeof(buffer), stdin) != 0)
{
...process line of data...
}
进行封装:
char *fgets_wrapper(char *buffer, size_t buflen, FILE *fp)
{
if (fgets(buffer, buflen, fp) != 0)
{
size_t len = strlen(buffer);
if (len > 0 && buffer[len-1] == '\n')
buffer[len-1] = '\0';
//清空剩余的数据
else{
int ch;
while ((ch = getc(fp)) != EOF && ch != '\n')
;
}
return buffer;
}
return 0;
}
代码引自:http://stackoverflow.com/questions/1694036/why-is-the-gets-function-so-dangerous-that-it-should-not-be-used
PS:什么是缓冲区?
它是包含相同数据类型实例的一个连续的计算机内存块。是程序运行期间在内存中分配的一个连续的区域,用于保存包括字符数组在内的各种数据类型。
版权声明:本文为BloodRose1991原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。