strtok()
在大部分情况下都能按预期工作,但我无法理解一个发现背后的原因。我已经阅读了关于 strtok()
的资料:
而且我们知道,要确定令牌的开始和结束位置,该函数首先从起始位置扫描第一个不包含在定界符中的字符(成为令牌的开始)。然后从该令牌的开始位置开始扫描第一个包含在定界符中的字符,这成为令牌的结束位置。
strtok()
在每个标记的末尾放置一个 \0
。但在以下程序中,最后一个定界符是一个点(.
),在该点和引号("
)之间有Toad。现在点是我的程序中的定界符,但在Toad之后没有定界符,甚至没有空格(在我的程序中是一个定界符)。请解释以下这个前提所引起的混淆:为什么
strtok()
认为Toad是一个标记,即使它不在两个定界符之间?当遇到空字符(\0
)时,我在strtok()
中读到:
这里没有说一旦遇到空字符就会返回指向标记开头的指针(我们甚至没有标记,因为我们没有找到标记的结尾,因为在从标记开头开始扫描时(即从Toad的 'T' 开始扫描),我们只找到了一个空字符,而没有找到定界符)。那么为什么一旦在调用 strtok 中找到 str 的终止空字符,所有随后使用 null 指针作为第一个参数调用此函数的调用都返回 null 指针。
strtok()
认为参数字符串的最后一个定界符和引号之间的部分是标记呢?请解释一下。
代码:
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] =" Falcon,eagle-hawk..;buzzard,gull..pigeon sparrow,hen;owl.Toad";
char * pch=strtok(str," ;,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ;,.-");
}
return 0;
}
输出:
猎鹰
老鹰
鹰
秃鹫
海鸥
鸽子
麻雀
母鸡
猫头鹰
蟾蜍
strtok()
的预期。 - Rüppell's VultureFalcon
被打印出来?我已经从源代码中提到了the function first scans from the starting location for the first character not contained in delimiters
,也就是说,在标记令牌的开头时,我们不需要分隔符(在我的程序中,空格是分隔符),但是为了标记令牌的结尾,我们显然需要一个分隔符,并且字符串末尾的 NULL 不在分隔符列表中。 - Rüppell's Vulture