需要知道何时使用strtok()在两个令牌分隔符之间没有数据出现

use*_*425 7 c strtok

我正在尝试对字符串进行标记,但我需要确切知道两个令牌之间何时没有数据.例如,当标记以下字符串" a,b,c,,,d,e"时,我需要知道' d'和' e' 之间的两个空槽...我无法简单地找到它strtok().我的尝试如下所示:

char arr_fields[num_of_fields];
char delim[]=",\n";
char *tok;
tok=strtok(line,delim);//line contains the data

for(i=0;i<num_of_fields;i++,tok=strtok(NULL,delim))
{
    if(tok)
        sprintf(arr_fields[i], "%s", tok);
    else
        sprintf(arr_fields[i], "%s", "-");          
}
Run Code Online (Sandbox Code Playgroud)

用上述例子执行上述代码将字符a,b,c,d,e放入前五个元素中arr_fields是不可取的.我需要每个字符的位置进入数组的特定索引:即如果两个字符之间缺少一个字符,则应该按原样记录.

Fil*_*efp 13

7.21.5.8 strtok函数

标准说明如下strtok:

[#3]序列中的第一个调用搜索指向的字符串,查找 s1 当前分隔符字符串中未包含的第一个字符 s2.如果没有找到这样的字符,则指向的字符串中没有标记,s1并且该strtok函数返回空指针.如果找到这样的字符,则它是第一个标记的开头.

在上面的引用中,我们可以读到您不能strtok用作特定问题的解决方案,因为它会将任何序列字符delims视为单个令牌.


我注定要沉默地哭泣,还是有人可以帮助我?

您可以轻松实现自己strtok喜欢的版本,请参阅本文末尾的摘要.

strtok_single使用strpbrk (char const* src, const char* delims)它将返回一个指针,该指针指向在以null结尾的字符串src中找到的delim中任何字符的第一个匹配项.

如果未找到匹配的字符,则该函数将返回NULL.


strtok_single

char *
strtok_single (char * str, char const * delims)
{
  static char  * src = NULL;
  char  *  p,  * ret = 0;

  if (str != NULL)
    src = str;

  if (src == NULL)
    return NULL;

  if ((p = strpbrk (src, delims)) != NULL) {
    *p  = 0;
    ret = src;
    src = ++p;

  } else if (*src) {
    ret = src;
    src = NULL;
  }

  return ret;
}
Run Code Online (Sandbox Code Playgroud)

样品使用

  char delims[] = ",";
  char data  [] = "foo,bar,,baz,biz";

  char * p    = strtok_single (data, delims);

  while (p) {
    printf ("%s\n", *p ? p : "<empty>");

    p = strtok_single (NULL, delims);
  }
Run Code Online (Sandbox Code Playgroud)

产量

foo
bar
<empty>
baz
biz
Run Code Online (Sandbox Code Playgroud)