当一行中有2个分隔符时,将字符串拆分为C中的标记

我正在使用strtok()函数将字符串拆分为Tokens。问题是当行中有2个分隔符时。

/* strtok example */ #include  #include  int main () { char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,"; char * pch; printf ("Splitting string \"%s\" into tokens:\n",str); pch = strtok (str,", "); while (pch != NULL) { printf ("Token = %s\n",pch); pch = strtok (NULL, ", "); } return 0; } 

并输出:

 Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens: Token = Test= Token = 0.28 Token = 0.0 Token = 1 Token = 1.9 Token = 2.2 Token = 1.0 Token = 8 Token = 4 Token = 42 

有一些简单的方法来获取所有令牌;我需要知道是否有内部分隔符的原因导致我有时间,或者,xxx,

谢谢。

strtok()明确地与你想要的相反。

在线手册中找到:

解析后的字符串中的两个或多个连续分隔符字节的序列被视为单个分隔符。 字符串开头或结尾的分隔符字节将被忽略。 换句话说:strtok()返回的标记总是非空的字符串。

strtok(3) – Linux手册页

我实现了strtoke()strtok()一个变体,它的行为类似,但你做了你想要的:

 /* strtoke example */ #include  #include  /* behaves like strtok() except that it returns empty tokens also */ char* strtoke(char *str, const char *delim) { static char *start = NULL; /* stores string str for consecutive calls */ char *token = NULL; /* found token */ /* assign new start in case */ if (str) start = str; /* check whether text to parse left */ if (!start) return NULL; /* remember current start as found token */ token = start; /* find next occurrence of delim */ start = strpbrk(start, delim); /* replace delim with terminator and move start to follower */ if (start) *start++ = '\0'; /* done */ return token; } int main () { char str[] ="Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,,"; char * pch; printf ("Splitting string \"%s\" into tokens:\n",str); pch = strtoke(str,", "); while (pch != NULL) { printf ("Token = %s\n",pch); pch = strtoke(NULL, ", "); } return 0; } 

在cygwin上用gcc编译和测试:

 $ gcc -o test-strtok test-strtok.c $ ./test-strtok.exe Splitting string "Test= 0.28,0.0,1,,1.9,2.2,1.0,,8,4,,,42,," into tokens: Token = Test= Token = 0.28 Token = 0.0 Token = 1 Token = Token = 1.9 Token = 2.2 Token = 1.0 Token = Token = 8 Token = 4 Token = Token = Token = 42 Token = Token = 

以上链接的另一个引用:

使用这些function时要小心。 如果您确实使用它们,请注意:

  • 这些函数修改了第一个参数。
  • 这些函数不能用于常量字符串。
  • 分隔字节的标识丢失。
  • strtok()函数在解析时使用静态缓冲区,因此它不是线程安全的。 如果这对您很重要,请使用strtok_r()。

这些问题也适用于我的strtoke()