0

在 strtok 函数中需要帮助

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

int main()
{
    char string[100], *ptr = NULL;

    memset(string, 0, 100);
    strcpy(string, "abc#efg#xyz");

    ptr = strtok(string, "#");
    fprintf(stderr, "ptr = [%s]\n", ptr);

    ptr = strtok(NULL, "#");
    fprintf(stderr, "ptr = [%s]\n", ptr);

    ptr = strtok(NULL, "#");
    fprintf(stderr, "ptr = [%s]\n", ptr);
    return 0;
}

输出是

ptr = [abc]
ptr = [efg]
ptr = [xyz]

这很好,但是如果第一个标记为空,那么第一次调用 strtok 将返回第二个标记。我的理解是,由于令牌不存在,它将在第一次调用中返回 null。

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

int main()
{
    char string[100], *ptr = NULL;

    memset(string, 0, 100);
    strcpy(string, "#efg#xyz");

    ptr = strtok(string, "#");
    fprintf(stderr, "ptr = [%s]\n", ptr);

    ptr = strtok(NULL, "#");
    fprintf(stderr, "ptr = [%s]\n", ptr);

    ptr = strtok(NULL, "#");
    fprintf(stderr, "ptr = [%s]\n", ptr);
    return 0;
}***

输出是

ptr = [efg]
ptr = [xyz]
ptr = [(null)]
4

2 回答 2

1

来自http://www.cplusplus.com/reference/cstring/strtok/

为了确定标记的开头和结尾,该函数首先从起始位置扫描不包含在分隔符中的第一个字符

所以我认为这是你看到的正确行为。strtok()从您的第一个字符开始,将其视为分隔符,忽略它,并向前寻找第一个非分隔符字符。

我想解决方法是自己检查第一个字符是否不是分隔符。

也检查了 C 标准 (ISO/IEC 9899:1999(E)) 并且定义是相同的:

序列中的第一个调用在 指向的字符串中搜索s1 不包含在 指向的当前分隔符字符串中的第一个字符s2

事实上,该标准在 7.21.5.8 的要点 8 中给出了一个示例:

#include <string.h>
static char str[] = "?a???b,,,#c";
char *t;
t = strtok(str, "?"); // t points to the token "a"
于 2013-08-16T14:11:59.430 回答
1

根据strtok手册页(来自man strtok):

解析字符串中的两个或多个连续分隔符的序列被认为是单个分隔符。字符串开头或结尾的分隔符将被忽略。换句话说:strtok() 返回的标记总是非空字符串。

于 2013-08-16T14:12:30.070 回答