strtok()问题:如果标记由分隔符分隔,为什么分隔符和空'\ 0'之间的最后一个标记?

Rüp*_*ure 7 c token delimiter strtok

在下面的程序中,strtok()主要部分按预期工作,但我无法理解一个发现背后的原因.我读过strtok()这个:

为了确定令牌的开始和结束,该函数首先从起始位置扫描未包含在分隔符中的第一个字符(它成为令牌的开头).然后从令牌的开头开始扫描包含在分隔符中的第一个字符,这将成为令牌的结尾.

资料来源:http://www.cplusplus.com/reference/cstring/strtok/

而且正如我们所知,在每个令牌的末尾strtok()放置一个\0.但是在下面的程序中,最后一个分隔符是一个点(.),之后在该点和引号()之间有Toad".现在点是我程序中的分隔符,但是在Toad之后没有分隔符,甚至没有空格(在我的程序中是分隔符).请清除以下因此产生的混淆:

为什么strtok()Toad视为令牌,即使它不在2个分隔符之间?这是我strtok()遇到NULL字符(\0)时读到的内容:

一旦在strtok的调用中找到了str的终止空字符,所有后续调用此函数并使用空指针作为第一个参数返回空指针.

资料来源:http://www.cplusplus.com/reference/cstring/strtok/

没有任何地方说过,一旦遇到空字符,就会返回一个指向令牌开头的指针(我们甚至没有令牌,因为我们没有得到令牌的结尾,因为没有找到分隔符字符在从令牌的开头开始扫描之后(即从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)

输出:






鸽子
麻雀
母鸡
猫头鹰
蟾蜍

Dan*_*her 9

标准规范strtok(7.24.5.8)非常清楚.特别是第4段(我强调)与问题直接相关,如果我理解正确的话:

3序列中的第一个调用搜索指向的字符串,查找s1当前分隔符字符串中未包含的第一个字符s2.如果没有找到这样的字符,则指向的字符串中没有标记,s1并且该strtok函数返回空指针.如果找到这样的字符,则它是第一个标记的开头.

4 strtok然后,该函数从那里搜索当前分隔符字符串中包含的字符.如果未找到此类字符,则当前标记将扩展到指向的字符串的末尾s1,随后对标记的搜索将返回空指针.如果找到这样的字符,它将被空字符覆盖,该字符终止当前令牌.该strtok函数保存指向以下字符的指针,从该字符开始下一次搜索令牌.

在通话中

char *where = strtok(string_or_NULL, delimiters);
Run Code Online (Sandbox Code Playgroud)

返回的令牌(指向的指针) - 如果有的话 - 从起始位置(包括)找到的第一个非定界符延伸到下一个定界符(不包括),如果存在,或者字符串的结尾,如果没有以后的分隔符字符.

链接描述没有明确提到延伸到字符串结尾的标记的情况,而不是标准,因此在这方面它是不完整的.

  • `如果没有找到这样的字符,当前令牌会延伸到s1指向的字符串的末尾,随后对令牌的搜索将返回一个空指针`---谢谢,**指甲**,采取从标准开始.那就是我想知道的**. (2认同)