关于 fscanf_s 的 bug

最近在写一个数据加密的软件程序,读取数据时使用的是 fscanf_s,一来用 fscanf 函数可能会报 warning,二来感觉 fscanf_s 比 fscanf 函数安全一点

但是读取大文件的时候出现了问题:

char buf[4096+1] = {0};
while (fscanf_s(file, "%s", buf,sizeof(buf)) != -1) 
{
	m_pw.Append(buf, strlen(buf));
	read_cnt += strlen(buf);
}

当数据超出4096时,前几次读取的数据都为空,最后一次读取的数据才会放到buffer里面
网上查阅资料没有看到类似的问题,但是我发现了这样的写法

fscanf(file,"%4096s",buf);

突然就发现 fscanf_s 不香了

但是总觉得很奇怪,没有看到别人提到这个问题
所以我又到处搜了搜
发现了这个网站
https://sourceware.org/bugzilla/show_bug.cgi
这是一个项目bug提交网站,比方说,glibc函数有bug,那么可以提交到上面,以供相互交流
搜了一下scanf_s, fscanf_s, sscanf_s都没有相关的结果

然后我继续查,在https://code.fandom.com/wiki/Scanf_s下有这样的内容
在这里插入图片描述
似乎scanf_s, fscanf_s等都是Microsoft compilers特有的,不是标准库的内容
从代码移植性角度考虑也不应该使用这些函数

补充:
格式化输入的两个特别参数

  • %*s 表示跳过这个输入
    printf("%.*f ",4,1.2); 表示将1.2输出为.4f格式
  • %[]s 表示只获取包含括号内字符的字符串
    具体查看手册

总结:不要使用fscanf_s,scanf_s等函数,会导致兼容性问题,同时fscanf_s函数存在bug

思考:写程序还是要多加思考的,任何函数都可能有隐藏的bug,有时候封装出来的函数不一定好,不一定就弃旧换新

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值