【问题标题】:Split string into Tokens in C, when there are 2 delimiters in a row当连续有 2 个分隔符时,将字符串拆分为 C 中的标记
【发布时间】:2017-07-08 00:31:31
【问题描述】:

我正在使用 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,

谢谢。

【问题讨论】:

标签: c split token strtok


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2021-03-30
    • 2013-10-12
    相关资源
    最近更新 更多