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

时间:2017-04-05 17:26:57

标签: 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);
    }
    return 0;
}

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

2 个答案:

答案 0 :(得分:0)

引用C11,章节§7.24.5.8,P4(强调我的

  

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

和P5,

  

每个后续调用都会以空指针作为第一个参数的值开始   从保存的指针中搜索 [...]

因此,这是一项使strtok()能够继续解析最初提供的字符串的剩余的功能。

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

如果没有此功能,则需要手动操作以保留搜索分隔符时进度的标签。

答案 1 :(得分:0)

首先,您应该再次阅读docs,并确保了解每个参数和回报。

其次,您的代码已损坏,在某个时刻puts将使用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;
}

在任何情况下,如果您在仔细阅读文档后有疑问,则其他thread可能会帮助您解决问题。