首页 > 解决方案 > 使用函数 sscanf 解析逗号分隔值的问题

问题描述

我在尝试使用 sscanf 从字符串中读取值时遇到了问题,但我不知道自己做错了什么。

#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, "%[^,]s,%lu,%lf", name, &q, &p); 

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

当我运行以下代码时,预期的输出应该是

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

然而,生成的输出类似于

result = 1
line = `Super Furnace,400,300.000000`
data read: Super Furnace, 94536181571648, 0.000000

标签: ccsvscanf

解决方案


因为你知道只读这三个字段之一result。如果你改变1sscanf()

    size_t q;
    double p;

    size_t q = 2;
    double p = 3.3;

输出变为

result = 1
line = `Super Furnace,400,300.000000`
data read: Super Furnace, 2, 3.300000

始终初始化所有变量。在输出中包含您的字符串也很有用,因为我们看不到空格或TAB. 就像你在上一行所做的那样......

就像是

#include <stdio.h>

int main(void)
{
    const char line[] = "Super Furnace,400,300.000000";
    char name[20];
    size_t q = 2;
    double p = 3.3;    
    int result = sscanf(line, "%[^,],%lu,%lf", name, &q, &p); 
    printf("result = %d\n", result);
    if ( result != 3 ) return -1;
    printf("line = `%s`\n", line);
    printf("data read: \"%s\", %ld, %lf\n", name, q, p);
    return 0;
}

得到

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

正如评论中所发布的那样,这%[^,]是一个有效的说明符,而s之前的说明%lu将阻止sscanf()查看该行的其余部分


推荐阅读