为什么 strtok 函数会一个接一个地忽略两个标记
Why the strtok function ignores two tokens one after the other
我有一个代码将我的 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个token('/')依次保存token顺序有问题
示例:“abc/a//bb”
(SIZE=4)
行数=['abc','a','bb',null]
我希望结果是:
rows=['abc','a',null,'bb'](保存token的顺序)
我该如何解决这个问题?
是的,那是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)++ = '[=10=]';
else
*stringp = NULL;
}
return rv;
}
我有一个代码将我的 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个token('/')依次保存token顺序有问题
示例:“abc/a//bb”
(SIZE=4)
行数=['abc','a','bb',null]
我希望结果是:
rows=['abc','a',null,'bb'](保存token的顺序)
我该如何解决这个问题?
是的,那是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)++ = '[=10=]';
else
*stringp = NULL;
}
return rv;
}