c - 在 C 中使用 sprintf 并收到警告时出现问题
问题描述
每当我在 C 中编码时尝试使用 sprintf() 时,都会收到一条警告:
“警告:'%s' 指令将最多 49 个字节写入大小为 39 的区域 [-Wformat-overflow=]”
它还制作了一张纸条,上面写着:
“注意:'sprintf' 输出 13 到 62 个字节到大小为 50 62 | sprintf(msg,"fopen-ing "%s"",data_file) 的目标;"
下面我给出了我的代码的一部分,主要是我收到这个警告的地方。
char data_file[50]; // Global
void initialize_from_data_file()
{
FILE *fpS;
if((fpS = fopen(data_file,"r")) == NULL)
{
char msg[50];
sprintf(msg,"fopen-ing \"%s\"",data_file);
perror(msg);
exit(1);
}
...
}
由于我是新使用这种语言,所以无法理解如何删除此警告。
解决方案
它警告您,目标缓冲区sprintf
可能不够大,无法容纳您要放入其中的字符串。如果data_file
长度超过 40 个字符,sprintf
将写入数组末尾msg
。
足够大以容纳将msg
进入其中的字符串:
char msg[70];
然而还有另一个问题。由于您在调用sprintf
之前调用perror
,后者将报告调用的错误状态sprintf
,而不是fopen
调用。
sprintf
所以在这种情况下根本不要使用并使用strerror
来获取错误字符串:
fprintf(stderr,"fopen-ing \"%s\": %s",data_file,strerror(errno));
推荐阅读
- angular - 如何从角度7中的对象数组中制作带有复选框的列表并实现多选并选择所有功能
- r - 如何以整洁的形式将文本数据解析为 data.table?
- java - 计算 BST 中小于 X 的节点数
- php - 如何使用 PHP 在多维数组中显示重复数据
- arrays - bash:如何将数组元素添加到命令中?
- swift - 如何将 ViewController.swift 中的按钮链接到 xib 文件?
- python - 为什么解压元组时 var 类型会发生变化?
- cordova - 具有多个图像的 ionic 1 闪屏
- netlogo - 如何检查补丁是否在特定滴答声\时间内保持状态?
- javascript - JQuery - 将整数更改为带一位小数的浮点数