fgets函数规范的字符串输入函数

  • Post author:
  • Post category:其他


今天在写测试代码时,使用了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 版权协议,转载请附上原文出处链接和本声明。