【问题标题】:Issues with sscanf in CC 中 sscanf 的问题
【发布时间】:2021-02-19 01:42:03
【问题描述】:

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

例如下面的代码sn-p

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

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

【问题讨论】:

  • 你能纠正正确的输出吗?
  • 提示:始终检查函数调用的返回值。

标签: c csv parsing scanf


【解决方案1】:

%s 停在空白处,您将, 放在格式字符串中这一事实不会改变这种行为。您应该使用%[^,] 转换规范。

以这种方式更改代码:

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() 手动解析字符串字段。

【讨论】:

  • 感谢您的回答,它有效。但是我能问一下“ .... %[^,] 无法解析空字段”是什么意思吗? ?对不起,我还是 C 的新手
猜你喜欢
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多