【问题标题】:Need help in strtok function when the first token is null当第一个标记为空时,strtok 函数需要帮助
【发布时间】:2013-08-16 14:07:37
【问题描述】:

在 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)]

【问题讨论】:

标签: c strtok stringtokenizer proc


【解决方案1】:

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

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

【讨论】:

  • 我要同时引用同一个句子。恭喜你赢了:-)
【解决方案2】:

来自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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多