strtok如何以及为什么记得字符串?

Pra*_*ari 1 c string split libc strtok

在下面的C程序中,strtok用于分割字符串.程序提供例外输出,但我无法理解它是如何工作的.

首先,我们将字符串传递给tokenizedelimiter.但是在后来的迭代中,我们只是过去了NULL.函数如何以及为何记住字符串?

如果我想同时使用tokenize到不同的字符串怎么办?

#include "stdafx.h"
#include <cstdio>
#include <cstring>

int main(int argc, char* argv[])
{
    char arr[] = "This is string to split";

    char * subStr = new char[10];
    subStr = strtok(arr, " ");

    while (subStr)
    {
        printf("%s\n", subStr);
        subStr = strtok(NULL, " ");
    }

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

输出:

This
is
string
to
split
Run Code Online (Sandbox Code Playgroud)

Ker*_* SB 5

strtok函数具有内部状态,可记住它已到达的最后位置.由于它通过将标记替换为零来覆盖原始字符串,因此需要记住的是字符串中的下一个位置.如果strtok使用非空字符串参数调用,则内部状态将重置为新字符串.实际上,你不能一次在多个字符串上使用它,只能一个接一个地使用它.(某些平台提供了可重入的变体strtok_r,允许您传递自己的状态变量.)

这是一个示例实现:

char * my_strtok(char * in, char delim)   // not quite the same signature
{
    _Thread_local static char * pos = NULL;

    if (in) { pos = in; }

    char * p = find_next_delimiter(pos, delim);    // NULL if not found
    if (p) { *p = '\0'; ++p; pos = p; }

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

(实际strtok搜索给定列表的任何分隔符,并跳过空字段.)这种可重入变量将用pos函数参数替换静态变量.