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()
.
手动解析字符串字段
我正在编写一个可以读取 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()
.