我需要解析一个包含两个整数和两个字符串的字符串,它们都用逗号分隔。字符串中包含引起问题的空格。格式为整数,字符串[包括空格],字符串[包括空格],整数。在具有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;
我没有收到编译错误或任何其他信息,但是却遇到了一些问题,即如果有空格,数据将变为垃圾。
答案 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
字符以终止其标记化的字符串。 (这就是string1
和string2
现在可以成为指针的原因。)