需要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)]
答案 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()返回的标记总是非空字符串。