0

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

4 回答 4

3

您可能想查看nonstandard strsep,它被设计为strtok允许解析空字段的替代品。另请参阅 glibc 手册中有关在字符串中查找令牌的章节。它在许多系统(各种 BSD、Linux、Mac OS X)上都可用,但不是标准化的,所以我相信它可能不会出现在 Windows 或 Solaris 上。

于 2009-12-30T04:28:18.257 回答
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并且必须采用另一种解决方案。

于 2009-12-30T04:38:07.460 回答
0
strtok cannot cannot distinguish between `,` and `,,`.
于 2009-12-30T04:25:06.797 回答
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;
}
于 2009-12-30T04:31:17.487 回答