是的,这就是
我有一个代码可以将我的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;
}