使用sprintf生成文件名缓冲区遇格式错误,如何修正?
问题分析与解决
警告原因
你混淆了格式符的用途:%c是用来输出单个字符的,它要求的参数类型是int(实际传入char会被自动提升为int);但你传入的file_name是char*类型(字符数组名会隐式转换为指向首元素的指针),类型不匹配,所以clang-10抛出了格式不匹配的警告。
正确的格式化写法
要输出字符串(以\0结尾的字符数组),对应的格式符是%s,修改后的代码如下:
char file_name[ ] = "/path/filename.bin"; int file_name_len = sizeof(file_name); char file_name_buffer[file_name_len]; sprintf(file_name_buffer, "%s", file_name); // 把%c改成%s outfile = fopen(file_name_buffer, "wb+");
更优的替代方案
因为你只是单纯复制字符串,不需要复杂的格式化操作,直接使用strcpy会更高效、更直观:
strcpy(file_name_buffer, file_name);
strcpy专门用于字符串复制,它会自动处理末尾的\0,完全满足你的需求。
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

