【问题标题】:Why do we use NULL in strtok()?为什么我们在 strtok() 中使用 NULL?
【发布时间】:2014-06-20 19:18:35
【问题描述】:

为什么我们在strok()函数中使用NULL

while (h != NULL)
{
    h = strtok(NULL, delim);  
    if (hold != NULL) 
      printf("%s", hold);    
}

*h 指向一个字符串时,这个程序会做什么?

【问题讨论】:

  • 您是否对strtok 的实际作用进行过研究或阅读?
  • 是的。我知道它使用分隔符解析字符串。但是 h!=NULL 是什么意思?
  • 感谢伙伴,但为什么我们在这里使用它? ----> h=strtok(NULL,delim);
  • @user3600999:这应该在你方便的 C 参考手册中解释。它告诉 strtok 从前一个令牌的末尾继续扫描。

标签: c null strtok


【解决方案1】:

strtok 是 C 库的一部分,它的作用是将 C 空分隔字符串拆分为由您指定的任何分隔符分隔的标记。

第一次调用 strtok 必须将 C 字符串传递给标记化,随后的调用必须指定 NULL 作为第一个参数,它告诉函数继续标记你首先传入的字符串。

函数的返回值返回一个 C 字符串,它是当前检索到的标记。所以第一次调用 --> 第一个令牌,第二个调用(指定 NULL) --> 第二个令牌,依此类推。

当没有剩余要检索的标记时,strtok 返回 NULL,表示字符串已完全标记化。

这是参考,并带有示例:http://www.cplusplus.com/reference/cstring/strtok/

【讨论】:

    【解决方案2】:
    char * strtok ( char * str, const char * delimiters );
    

    str - 要截断的 C 字符串。 请注意,这个字符串是通过分解成更小的字符串(令牌)来修改的。 或者,可以指定空指针,在这种情况下,函数会继续扫描之前成功调用函数的位置。

    delimiters - 包含分隔符的 C 字符串。 这些可能因一次调用而异。

    更多关于strtok()的信息请看link

    【讨论】:

      【解决方案3】:

      strtok() 将指针存储在 静态变量 中你上次离开的地方,所以在第二次调用时,当我们传递 null 时,strtok () 从静态变量中获取指针。

      如果您提供相同的字符串名称,它会再次从头开始。

      此外,strtok() 具有破坏性,即它会更改原始字符串。 所以请确保您始终拥有一份原始副本。

      使用 strtok() 的另一个问题是,由于它将地址存储在静态变量中,因此在多线程编程中多次调用 strtok() 会导致错误。 为此使用 strtok_r()

      【讨论】:

        【解决方案4】:

        来自 strtok 的手册页(我使用 cygwin 并且安装了所有 posix 手册)

         Searching for Word Separators
               The following example searches for tokens separated by <space> characters.
        
                   #include <string.h>
                   ...
                   char *token;
                   char line[] = "LINE TO BE SEPARATED";
                   char *search = " ";
        
                   /* Token will point to "LINE". */
                   token = strtok(line, search);
        
                   /* Token will point to "TO". */
                   token = strtok(NULL, search);
        

        基本上,后续调用中的 strtok 需要 NULL,在上面的示例中使用搜索字符串,在 while 循环中第一次调用 strtok LINE TO BE SEPARATED 将使令牌指向 LINE,但在后续调用中它将跳过空格并指向基本上当使用 NULL 时,token 将返回一个指向分隔符字符串前面的位置的指针。

        【讨论】:

          【解决方案5】:

          char * strtok (char * str, const char * delimiters) 的一系列调用将字符串拆分为标记。 第一次调用 strtok() 将字符串和分隔符作为输入,并返回字符串的 first 标记。

          要找到字符串的剩余标记 后续调用 是必需的,并且通过将 NULL 作为输入传递给 strtok( NULL 来指定后续调用> , const char *delimiters ).

          当没有找到更多令牌时返回 NULL。

          注意:字符串“delimiters”在每次调用时可能不同。

          【讨论】:

            猜你喜欢
            • 2020-01-29
            • 1970-01-01
            • 2020-01-04
            • 1970-01-01
            • 2011-02-05
            • 2017-11-04
            • 1970-01-01
            • 1970-01-01
            • 2021-07-26
            相关资源
            最近更新 更多