【发布时间】:2021-12-09 08:00:35
【问题描述】:
每当我在 C 中编码时尝试使用 sprintf() 时,都会收到一条警告:
"警告:'%s' 指令将最多 49 个字节写入大小为的区域 39 [-Wformat-overflow=]"
它还产生了一个说明:
"note: '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);
}
...
}
由于我是新使用这种语言,所以无法理解如何删除此警告。
【问题讨论】:
-
msg太小,无法容纳sprintf的结果。 -
msg 是一个包含 50 个字符的缓冲区,并且您正在发送(可能)50 个字符(来自 data_file)+ 12 个额外字符的格式字符串。编译器警告您这可能会溢出。您应该在 msg 缓冲区中分配更多空间。
-
你了解
sprintf的作用吗?你能估计它会产生多少个字符吗?您能否验证该输出是否适合目标数组? -
消息很清楚。您想生成一个字符串并将其存储在一个不够大的空间中。
-
谢谢。现在我明白了。