C 中 sscanf 的问题

Issues with sscanf in C

我正在编写一个可以读取 csv 格式文本的程序,但我遇到了一个问题,即 sscanf 仅在用“,”分隔时将整个内容解析为一个字符串。

例如下面的一段代码

char str[100] = "Alex,2933,89,";
char name[50] = "";
int id;
double mark;

sscanf(str, "%s,%d,%lf,", name, &id, &mark);
printf("%s\n", name);
printf("%d\n", id);
printf("%f\n", mark);

输出为:

Alex,2933,89,
896
0.000000

这显然不是预期的输出。 但是当 str 被编辑为 str = "Alex 2933 89 " 时,代码给出了正确的输出。

工作代码:

char str[100] = "Alex 2933 89 ";
char name[50] = "";
int id;
double mark;

sscanf(str, "%s %d %lf ", name, &id, &mark);
printf("%s\n", name);
printf("%d\n", id);
printf("%f\n", mark);

正确输出:

Alex
2933
89.000000

我能知道如何解决这个问题吗?

%s 停在白色 space,您在格式字符串中放置 , 的事实不会改变此行为。您应该使用 %[^,] 转换规范。

这样更改代码:

char str[100] = "Alex,2933,89,";
char name[50] = "";
int id;
double mark;

if (sscanf(str, "%49[^,],%d,%lf,", name, &id, &mark) == 3) {
    printf("%s\n", name);
    printf("%d\n", id);
    printf("%f\n", mark);
}

但是请注意,%[^,] 无法解析空字段。如果 CSV 行可能包含空字段,例如 ,23,89.0, sscanf() 将无法转换 name,因为没有字符符合 %[^,] 规范。如果源文件中有这样的行,您应该使用 strchr()strcspn().

手动解析字符串字段