用空格解析逗号分隔的字符串

时间:2019-07-26 14:00:04

标签: c parsing scanf

我需要解析一个包含两个整数和两个字符串的字符串,它们都用逗号分隔。字符串中包含引起问题的空格。格式为整数,字符串[包括空格],字符串[包括空格],整数。在具有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;

我没有收到编译错误或任何其他信息,但是却遇到了一些问题,即如果有空格,数据将变为垃圾。

1 个答案:

答案 0 :(得分: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的功能也很差(其状态非常la脚)
  • strtok基本上跳过了空字段,这可能不是您想要的(如果输入行例如是"12,string,,34"之类的东西)

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

还要注意,我将line更改为数组,以便对其进行修改,因为strtok在其中插入了\0字符以终止其标记化的字符串。 (这就是string1string2现在可以成为指针的原因。)