【问题标题】:Problem while using sprintf in C and getting warning在 C 中使用 sprintf 并收到警告时出现问题
【发布时间】: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 的作用吗?你能估计它会产生多少个字符吗?您能否验证该输出是否适合目标数组?
  • 消息很清楚。您想生成一个字符串并将其存储在一个不够大的空间中。
  • 谢谢。现在我明白了。

标签: c printf


【解决方案1】:

警告您sprintf 的目标缓冲区可能不够大,无法容纳您要放入其中的字符串。如果 data_file 的长度超过 40 个字符,sprintf 将写到数组 msg 的末尾。

使msg 大到足以容纳要插入其中的字符串:

char msg[70];

但是还有另一个问题。由于您在调用perror 之前调用了sprintf,因此后者将报告sprintf 调用的错误状态,而不是fopen 调用。

所以在这种情况下根本不要使用sprintf,而是使用strerror来获取错误字符串:

fprintf(stderr,"fopen-ing \"%s\": %s",data_file,strerror(errno));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-01
    • 2014-01-08
    • 1970-01-01
    • 2015-03-17
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多