在以下程序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;
}
输出:
猎鹰
鹰
鹰
秃鹰
鸥
鸽子
麻雀
母鸡
猫头鹰
蟾蜍