首页 > 解决方案 > 在 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);
    }
    ...
}

由于我是新使用这种语言,所以无法理解如何删除此警告。

标签: cprintf

解决方案


它警告您,目标缓冲区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));

推荐阅读