GCC编译C语言代码出现sscanf参数类型不匹配警告及无输出问题
问题原因与解决方案
核心问题1:缓冲区长度不足
你定义的char SecondPart[] = ""仅分配了长度为1的内存空间,仅能存储字符串结束符\0,完全不足以存储sscanf匹配到的数字内容,写入时直接发生栈溢出,属于未定义行为,自然无法正常输出内容。
核心问题2:参数类型不匹配(对应你遇到的编译警告)
%[0-9 ]格式符要求接收char *类型的指针,你之前传入的&SecondPart是指向长度为1的char数组的指针char (*)[1],和要求的类型不匹配。
其他隐藏问题
- 未判断
popen、fgets的返回值,如果命令执行失败、读取结果为空,后续sscanf操作会访问空指针,可能直接触发崩溃。 sscanf未加长度限制,即使缓冲区分配足够,也存在溢出风险。
修复步骤
- 给
SecondPart分配足够的缓冲区长度,比如要存储最多30位的数字加空格,可定义为char SecondPart[32] = {0}; - 修改
sscanf的参数,直接传入SecondPart(数组名自动退化为char *指针),同时给格式符加长度限制避免溢出:sscanf(resultato,"%31[0-9 ]", SecondPart); - 增加返回值判断逻辑,避免空指针访问。
- 直接输出
SecondPart即可,不需要取地址或者偏移超过数组长度的索引。
修复后的完整代码示例:
RING_FUNC(ring_binapiceckservertime) { char Address[100] = {0}; const char *UrlSpec = "/time"; char *FirstPart[30] = {0}; // 分配足够的缓冲区 char SecondPart[32] = {0}; size_t sz = strlen(cmDOriG) + strlen(UrlApi)+ strlen(UrlApiV3) + strlen(UrlSpec) + 1; char destination[sz]; strcpy(destination, cmDOriG); strcat(destination, UrlApi); strcat(destination, UrlApiV3); strcat(destination, UrlSpec); const char* mode = "r"; FILE *cmd=popen(destination, mode); if (cmd == NULL) { perror("popen failed"); return; } char result[50]={0x0}; const char *resultato = fgets(result, sizeof(result), cmd); if (resultato == NULL) { perror("fgets failed or no result returned"); pclose(cmd); return; } // 加长度限制,参数直接传SecondPart sscanf(resultato,"%31[0-9 ]", SecondPart); pclose(cmd); printf("%s\n", SecondPart); printf("value of b_static: %s\n", SecondPart); }
内容的提问来源于stack exchange,提问作者armanvanlendel
相关产品推荐
相关产品推荐

