Pra*_*ari 1 c string split libc strtok
在下面的C程序中,strtok用于分割字符串.程序提供例外输出,但我无法理解它是如何工作的.
首先,我们将字符串传递给tokenize和delimiter.但是在后来的迭代中,我们只是过去了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)
该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函数参数替换静态变量.