【问题标题】:Parsing comma separated strings with spaces用空格解析逗号分隔的字符串
【发布时间】:2019-12-04 21:25:00
【问题描述】:

我需要解析一个包含两个整数和两个字符串的字符串,它们都用逗号分隔。字符串包含导致问题的空格。格式为整数、字符串[包括空格]、字符串[包括空格]、整数。使用 gcc、c99 标准在 Linux 上工作。

我尝试过使用各种正则表达式样式的解析方法进行解析。我有解决方案,如果字符串没有空格但在涉及空格时会中断。

char *line = "5,some text, some more text with spaces, 3";
int num1, num2;
char string1[max_size];
char string2[max_size];

sscanf(line, "%d,%[^,],%[^,],%d", &num1, string1, string2, &num2);

我希望变量包含:

num1 == 5;
string1 == "some text";
string2 == "some more text with spaces";
num2 == 3;

我没有遇到编译错误或任何问题,但我遇到了问题,如果有任何空格,数据就会变成垃圾。

【问题讨论】:

  • 你会考虑使用scanf以外的其他东西吗?这是一个非常糟糕的工具,如果你做任何复杂的事情,我发现它通常比它的价值更麻烦。这里的一个选项(虽然它也不完美)是strtok;另一个是strsep
  • 绝对开放,但限制在我可以使用的库中。我也在尝试使用 strtok 实现,但没有运气。
  • 当我尝试你的示例程序时,在重写任何东西之前,我或多或少地得到了预期的输出。 " some more text..." 中有一个额外的空间,但我认为没有什么是“垃圾”。您最常遇到的问题是什么?
  • 所以,请温柔一点,但我在函数中使用它...该函数被解析文本文件的其他代码调用。我想我最初是导致文本文件解析不正确。
  • 别担心,我不会让你失望的,我很欣赏你试图创建一个小而独立的例子。但是,如果这个小而独立的例子不能说明问题,如果问题只出现在我看不到的更大的程序中,那么我怀疑我(或这里的任何人)能够帮助你,或者……

标签: c parsing scanf


【解决方案1】:

下面是使用strtok 的代码的直接重写:

char line[] = "5,some text, some more text with spaces, 3";
int num1, num2;
char *string1;
char *string2;

num1 = atoi(strtok(line, ","));
string1 = strtok(NULL, ",");
string2 = strtok(NULL, ",");
num2 = atoi(strtok(NULL, ","));

printf("num1 = %d\n", num1);
printf("str1 = \"%s\"\n", string1);
printf("str2 = \"%s\"\n", string2);
printf("num2 = %d\n", num2);

这可行,尽管它有以下限制:

  • 我没有检查strtok 的返回值是否过早返回NULL(表明输入中的字段少于4 个)
  • atoi 也没有错误处理,如果数字字段不是数字,它将悄悄返回 0
  • 总的来说,strtok 也是一个很差的函数(它的状态很差劲)
  • strtok 基本上会跳过空字段,这可能不是您想要的(例如,如果输入行类似于 "12,string,,34"

尽管如此,这可能比尝试使用 sscanf 更好。

还请注意,我将line 更改为一个数组,以便它可以修改,因为strtok\0 字符插入其中以终止它标记的字符串。 (这就是为什么 string1string2 现在可以成为指针了。)

【讨论】:

  • 感谢您的帮助!
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2021-11-01
  • 2016-05-28
  • 2020-06-12
相关资源
最近更新 更多