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

使用sscanf函数解析逗号分隔值时出现的问题

问题原因

  • 格式说明符书写错误:你写的%[^,]s中,%[^,]本身就是完整的扫描集格式符,后缀的s是多余的。%[^,]会匹配所有非逗号的字符,读取完成后解析位置停在原字符串的逗号,处,此时sscanf会尝试用格式串里多余的s匹配当前位置的逗号,匹配直接失败,解析终止,所以仅成功读取了1个参数(name),后续的q、p都是未初始化的栈垃圾值。
  • size_t格式不匹配:%lu是unsigned long类型的输入格式符,C标准中size_t对应的输入/输出格式符为%zu,混用可能在部分平台出现类型长度不匹配的问题。
  • printf输出格式错误:打印size_t类型变量q时用%ld属于格式不匹配,同样会引发未定义行为。

修复方案

修改sscanf的格式串,删除多余的s,同时替换size_t对应的格式符:
将sscanf(line, "%[^,]s,%lu,%lf", name, &q, &p);
改为:sscanf(line, "%[^,],%zu,%lf", name, &q, &p);
同时修改printf中q的输出格式符为%zu。

修复后完整代码

#include <stdio.h>

int main(void)
{
    char line[] = "Super Furnace,400,300.000000";
    
    char name[20];
    size_t q;
    double p;
    
    int result = sscanf(line, "%[^,],%zu,%lf", name, &q, &p); 

    printf("result = %d\n", result);
    printf("line = `%s`\n", line);
    printf("data read: %s, %zu, %lf\n", name, q, p);
}

运行结果

result = 3
line = `Super Furnace,400,300.000000`
data read: Super Furnace, 400, 300.000000

内容的提问来源于stack exchange,提问作者Frustration

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:15:07