在下面的程序中,strtok()主要部分按预期工作,但我无法理解一个发现背后的原因.我读过strtok()这个:
为了确定令牌的开始和结束,该函数首先从起始位置扫描未包含在分隔符中的第一个字符(它成为令牌的开头).然后从令牌的开头开始扫描包含在分隔符中的第一个字符,这将成为令牌的结尾.
而且正如我们所知,在每个令牌的末尾strtok()放置一个\0.但是在下面的程序中,最后一个分隔符是一个点(.),之后在该点和引号()之间有Toad".现在点是我程序中的分隔符,但是在Toad之后没有分隔符,甚至没有空格(在我的程序中是分隔符).请清除以下因此产生的混淆:
为什么strtok()将Toad视为令牌,即使它不在2个分隔符之间?这是我strtok()遇到NULL字符(\0)时读到的内容:
一旦在strtok的调用中找到了str的终止空字符,所有后续调用此函数并使用空指针作为第一个参数返回空指针.
没有任何地方说过,一旦遇到空字符,就会返回一个指向令牌开头的指针(我们甚至没有令牌,因为我们没有得到令牌的结尾,因为没有找到分隔符字符在从令牌的开头开始扫描之后(即从Toad的'T'开始),我们只发现了一个空字符,而不是一个分隔符.那么为什么参数字符串的最后一个分隔符和引号之间的部分被认为是一个标记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; …Run Code Online (Sandbox Code Playgroud)