You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC编译C语言代码出现sscanf参数类型不匹配警告及无输出问题

问题原因与解决方案

核心问题1:缓冲区长度不足

你定义的char SecondPart[] = ""仅分配了长度为1的内存空间,仅能存储字符串结束符\0,完全不足以存储sscanf匹配到的数字内容,写入时直接发生栈溢出,属于未定义行为,自然无法正常输出内容。

核心问题2:参数类型不匹配(对应你遇到的编译警告)

%[0-9 ]格式符要求接收char *类型的指针,你之前传入的&SecondPart是指向长度为1的char数组的指针char (*)[1],和要求的类型不匹配。

其他隐藏问题

  • 未判断popen、fgets的返回值,如果命令执行失败、读取结果为空,后续sscanf操作会访问空指针,可能直接触发崩溃。
  • sscanf未加长度限制,即使缓冲区分配足够,也存在溢出风险。

修复步骤

  1. 给SecondPart分配足够的缓冲区长度,比如要存储最多30位的数字加空格,可定义为char SecondPart[32] = {0};
  2. 修改sscanf的参数,直接传入SecondPart(数组名自动退化为char *指针),同时给格式符加长度限制避免溢出:sscanf(resultato,"%31[0-9 ]", SecondPart);
  3. 增加返回值判断逻辑,避免空指针访问。
  4. 直接输出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:06:03