当第一个标记为null时,需要strtok函数的帮助

时间:2013-08-16 14:07:37

标签: c strtok stringtokenizer proc

需要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]

这很好,但是当第一个令牌为null时,第一次调用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)]

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

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

  

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