gpt4 book ai didi

c - 在 C 中使用 sprintf 并收到警告时出现问题

转载 作者:行者123 更新时间:2023-12-05 09:03:40 25 4
gpt4 key购买 nike

每当我在用 C 编写代码时尝试使用 sprintf() 时,我都会收到一条警告:

"warning: ‘%s’ directive writing up to 49 bytes into a region of size39 [-Wformat-overflow=]"

它还产生了一条说明:

"note: ‘sprintf’ output between 13 and 62 bytes into a destination ofsize 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];

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

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

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

关于c - 在 C 中使用 sprintf 并收到警告时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69680868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com