当一行中有2个分隔符

时间:2017-02-18 13:12:03

标签: c split token strtok

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

/* strtok example */
#include <stdio.h>
#include <string.h>

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,

谢谢。

1 个答案:

答案 0 :(得分:1)

strtok()显然与你想要的完全相反。

在线手册中找到:

  

解析后的两个或多个连续分隔符字节的序列   string被认为是一个单独的分隔符。分隔符字节在   字符串的开头或结尾被忽略。换句话说:代币   由strtok()返回的字符串总是非空字符串。

strtok(3) - Linux man page

我实施了strtoke() - strtok()的变体,其行为相似但却能满足您的需求:

/* strtoke example */
#include <stdio.h>
#include <string.h>

/* 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 = 

上述链接中的另一个引用:

  

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

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

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