strtok() - 为什么你必须传递NULL指针才能获得字符串中的下一个标记?

phe*_*ez1 22 c c++ string pointers strtok

这是strtok()的解释.

#include <string.h>
char* strtok( char* s1, 
              const char* s2 );*
Run Code Online (Sandbox Code Playgroud)

第一次调用strtok()会返回指向s1指向的字符串中第一个标记的指针.对strtok()的后续调用必须将NULL指针作为第一个参数传递,以便获取字符串中的下一个标记.

但我不知道,为什么你必须传递NULL指针才能获得字符串中的下一个标记.我搜索了大约15分钟,但没有在互联网上找到解释.

mcl*_*fix 39

strtok()通过使用静态变量将一些数据保留在自身内部.这样,strtok()可以从上次呼叫期间停止的点继续搜索.要strtok()表明您希望继续搜索相同的字符串,请将NULL指针作为其第一个参数传递.strtok()检查第一个参数是否是NULL,如果是,则使用其当前存储的数据.如果第一个参数不为null,则将其视为新搜索,并重置所有内部数据.

也许你能做的最好的事情就是搜索strtok()函数的实际实现.我发现一个小到足以在这里发布,所以你知道如何处理这个NULL参数:

/* Copyright (c) Microsoft Corporation. All rights reserved. */

#include <string.h>

/* ISO/IEC 9899 7.11.5.8 strtok. DEPRECATED.
 * Split string into tokens, and return one at a time while retaining state
 * internally.
 *
 * WARNING: Only one set of state is held and this means that the
 * WARNING: function is not thread-safe nor safe for multiple uses within
 * WARNING: one thread.
 *
 * NOTE: No library may call this function.
 */

char * __cdecl strtok(char *s1, const char *delimit)
{
    static char *lastToken = NULL; /* UNSAFE SHARED STATE! */
    char *tmp;

    /* Skip leading delimiters if new string. */
    if ( s1 == NULL ) {
        s1 = lastToken;
        if (s1 == NULL)         /* End of story? */
            return NULL;
    } else {
        s1 += strspn(s1, delimit);
    }

    /* Find end of segment */
    tmp = strpbrk(s1, delimit);
    if (tmp) {
        /* Found another delimiter, split string and save state. */
        *tmp = '\0';
        lastToken = tmp + 1;
    } else {
        /* Last segment, remember that. */
        lastToken = NULL;
    }

    return s1;
}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢,现在我理解了! (4认同)

Sti*_*sis 12

如果传递非NULL值,则要求它开始标记不同的字符串.

如果传递NULL值,则要求继续使用与以前相同的方式标记.

  • @ ezph1,它一次只处理一个字符串并保持内部状态,这会导致各种问题. (7认同)