分隔符后没有数据时的 strtok

strtok when no data after a delimiter

我需要知道什么时候两个分隔符之间没有数据,所以我在 Stack Overflow 上找到了以下 code

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;
}

采样函数

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);
}

输出

foo                                                                                                                                                                                
bar                                                                                                                                                                                
<empty>                                                                                                                                                                            
baz                                                                                                                                                                                
biz                                                                                                                                                                                
<empty>
// missing another <empty>

使用当前代码,它不会处理最后一个',' 之后的数据,应该还有一个空字段。我不确定如何获得正确的输出。

您应该使用 strsep 而不是 strtok。事实上,strsep 支持空字段:See this answer

这是一个例子:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main () {
        char delims[] = ",";
        char data  [] = "foo,bar,,baz,biz,,";
        char *p = strdup(data);
        char * tok;
        while ((tok = strsep(&p, delims)) != NULL) {
                printf ("%s\n", *tok ? tok : "<empty>");
        }
        free(p);
        return 0;
}

输出:

foo
bar
<empty>
baz
biz
<empty>
<empty>