在C语言中将字符串按标记分割成令牌,当有两个分隔符连续出现时。

4
我正在使用strtok()函数将字符串分割成标记。问题在于当有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
如果您使用的系统有strsep,则可以使用它。 - Some programmer dude
你可以参考I need a mix of strtok() and strtok_single()来获取一些想法。那里还有许多相关的问题链接,也可能会有所帮助。你并不是第一个遇到这种问题的人。 - Jonathan Leffler
1个回答

4

strtok()做的事情恰好和你想要的相反。

在线手册上找到的内容:

在解析的字符串中,两个或多个连续的定界符字节被视为单个定界符。字符串开头或结尾的定界符字节将被忽略。换句话说: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()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接