如何使用c解析','分隔的字符串?

时间:2009-12-30 04:16:09

标签: c cstring delimiter strtok

解析逗号分隔列表的最简单方法是什么,每个令牌之间可以有零个元素。 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,",");
}

感谢您的意见和帮助。 (也许我应该在张贴前仔细考虑这个问题。)

4 个答案:

答案 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;
}