为什么在C中使用strtok()时需要使用空指针?

为什么在C中使用strtok()时需要使用空指针?,c,string,null,strtok,C,String,Null,Strtok,首先,我的代码: #include <stdio.h> #include <string.h> int main() { char str[100]="nahin bin kaysar"; char *space; space = strtok(str," "); while(space != NULL) { space = strtok(NULL," "); puts(space); }

首先,我的代码:

#include <stdio.h>
#include <string.h>

int main()
{
    char str[100]="nahin bin kaysar";
    char *space;

    space = strtok(str," ");
    while(space != NULL) {
        space = strtok(NULL," ");
        puts(space);
    }
    return 0;
}
#包括
#包括
int main()
{
char str[100]=“nahin bin kaysar”;
字符*空间;
空格=strtok(str,“”);
while(空格!=NULL){
空格=strtok(空,“”);
放置(空格);
}
返回0;
}

我知道这个程序会把字符串分成三个不同的部分。在循环之前,我分割第一个单词并分配给字符串
空格
。但我的问题是为什么我必须在循环中使用
NULL
指针作为
strtok()
函数的参数。我已经搜索了几个小时,没有找到满足我需要的答案。

引用
C11
,第§7.24.5.8章,第4页(强调我的)

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

和P5

每个后续调用都会启动,第一个参数的值为空指针 从保存的指针搜索[…]

因此,这是一个特性,它允许
strtok()
继续解析最初提供的字符串的剩余部分

换句话说,包含分隔符多个实例的输入字符串可以使用此功能使用简单循环进行解析。例如,如果一个“句子”要基于“空白”标记以分离出每个“单词”,那么在第一次调用之后,一个简单的循环调用
strtok()
,并将
NULL
作为第一个参数,将使用内部保存指针,并且需要较少的显式工作来管理实际句子的其余部分


如果没有此功能,则需要手动记录搜索分隔符的进度。

首先,您应该再次阅读,并确保理解每个参数和返回值

其次,您的代码被破坏,在某个点上,
put
将使用NULL作为参数,它将崩溃,您可以这样修复它:

#include <string.h>
#include <stdio.h>

int main() {
    char str[100] = "nahin bin kaysar";
    const char s[2] = " ";
    char *token;

    token = strtok(str, s);
    printf("%s", token);
    while (token != NULL) {
        puts(token);
        token = strtok(NULL, s);
    }

    return 0;
}
#包括
#包括
int main(){
char str[100]=“nahin bin kaysar”;
常量字符s[2]=“”;
字符*令牌;
令牌=strtok(str,s);
printf(“%s”,标记);
while(令牌!=NULL){
卖出(代币);
令牌=strtok(空,s);
}
返回0;
}

在任何情况下,如果您在仔细阅读文档后有任何疑问,此文档可能会帮助您。

阅读文档?(例如)这意味着继续处理。也
space=strtok(NULL,”);放置(空格)-->
放置(空格);空格=strtok(空,“”)
,这是有原因的。b) 关于strtok()
,有什么不清楚的地方?它在内部存储标记化上下文,因此如果您使用
strtok(NULL,…)
调用它,它将继续对最新的字符串进行操作。这是一个令人困惑的调用,因为strtok()以静态方式维护内部状态,这使得您很难理解后续调用的工作方式,(除非在多线程代码中,在这种情况下它们不会:)。
NULL
通知
strtok()
从上次停止的位置继续标记化。非
NULL
值表示重新开始。