解析逗号分隔列表的最简单方法是什么,每个令牌之间可以有零个元素。 cstring看起来像
1, 3, 4, 5, 6, 7, 8, ....
但也可能看起来像
, , , , , , , , , ...
我尝试过类似的事情:
char *original = "1, 3, 4, 5, 6, 7, 8, ...."
char *tok = strtok(original," ,")
while(tok!=NULL){
while(*tok!='\0'){
//dostuff
tok++;
}
tok=strtok(NULL," ,");
}
这显然是有效的,如果逗号之间有元素,例如我注意到如果没有元素,将跳过第一个项目列表。
我尝试过像strchr()这样的其他解决方案,但这非常难看,我认为有一种更简单的方法。
由于
更新
经过一些测试后,我发现除了第一个项目丢失之外,所有情况下对“,”的标记似乎都有效。所以我把它作为一个特例来说明。
char *original = "1, 3, 4, 5, 6, 7, 8, ...."
if(*original==',')
//dostuff
char *tok = strtok(original,",")
while(tok!=NULL){
while(*tok!='\0'){
//dostuff
tok++;
}
tok=strtok(NULL,",");
}
感谢您的意见和帮助。 (也许我应该在张贴前仔细考虑这个问题。)
答案 0 :(得分:3)
您可能需要查看非标准 strsep
,它旨在替代strtok
,允许解析空字段。另请参阅Finding Tokens in a String上的glibc手册章节。它可以在许多系统(各种BSD,Linux,Mac OS X)上使用,但不是标准化的,所以我相信它可能不会出现在Windows或Solaris上。
答案 1 :(得分:2)
如果你需要做的就是忽略空的“标记”,你可以使用strspn
函数来检测只有空格的字符串。这是一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Is the given string whitespace only?
*/
int iswhitespace(char* s)
{
return (strspn(s, " \t") == strlen(s));
}
int main()
{
char line[] = "1, , 3, 4, 5, 6";
char sep[] = ",";
char* tok;
tok = strtok(line, sep);
while (tok)
{
if (iswhitespace(tok))
printf("empty token\n");
else
printf("new token: %s\n", tok);
tok = strtok(0, sep);
}
return 0;
}
这里的关键思想是仅对逗号进行标记,而不是“,”跳过第一个元素。然后可以单独处理空白。
当然,这仍然留下strtok
将跳过连续逗号的跨越这一事实。如果这对您不利,则无法使用strtok
,并且必须使用其他解决方案。
答案 2 :(得分:0)
strtok cannot cannot distinguish between `,` and `,,`.
答案 3 :(得分:0)
一个简单的for
循环怎么样?
for (int begin = 0; original[begin]; ) {
int end = begin;
while (original[end] && original[end] != ',')
++end;
// do something with original[begin] through original[end-1]
begin = end;
}