为什么strtok函数一个接一个地忽略两个标记



我有一个代码可以将我的char str[]拆分为令牌:

void my_function(char str[])
{   
int i = 0;
char *p = strtok(str, "/");
char *rows[SIZE] = { NULL };
while(p==NULL)
{
rows[i++] = p;
p = strtok(NULL, "/");
}
}

2个代币('/'(一个接一个地保存代币的订单时出现问题

示例:";abc/a//bb">

(大小=4(

rows=[abc','a','b',null]

我希望结果是:

rows=[abc','a',null,'b'](保存令牌的顺序(

我该如何解决这个问题?

是的,这就是strtok()的行为。传递给strtok()的令牌通常由某种空白分隔,当分隔符为空白时,这是用户的期望。

要克服这个问题,请实现您自己的令牌化器。

char *tokenize(char *s, char t, char **ctx)
{
if (s) *ctx = s;
if (!*ctx) return NULL;
s = *ctx;
if (!*s) return NULL;
while (**ctx) {
if (**ctx == t) {
**ctx = 0;
++*ctx;
return NULL;
}
++*ctx;
}
return s;
}

strtok为您提供由1个或多个分隔符字符串分隔的令牌,因此根据定义,您不能获得空令牌。如果要使用单字符分隔符分隔标记,请改用strsep。不同寻常的是,这只在BSD和Linux系统上可用,但自己编写也很容易:

char *strsep(char **stringp, const char *delim) {
char *rv = *stringp;
if (rv) {
*stringp += strcspn(rv, delim);
if (**stringp)
*(*stringp)++ = '';
else
*stringp = NULL;
}
return rv;
}

相关内容

  • 没有找到相关文章

最新更新