带有NULL的Strtok用法
Strtok usage with NULL
我在http://www.cplusplus.com/reference/cstring/strtok/,不明白他们是如何通过"pch=strtok(NULL,",.-");"从一个令牌到另一个令牌的
这是代码:
/* strtok example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string "%s" into tokens:n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%sn",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
这是输出:
Splitting string "- This, a sample string." into tokens:
This
a
sample
string
strtok
通过静态变量保持内部状态,这样您就可以在多个调用中处理一个字符串。调用strtok(str, ...)
后,对strtok(NULL, ...)
的后续调用将从str
获得后续令牌。换句话说,第一个调用获得第一个令牌。随后的调用通过传递NULL
来重用相同的字符串,从而获得后续的令牌。
如手册所述,
strtok()函数将字符串解析为一系列标记。在第一次调用strtok()时,应在str中指定要解析的字符串。在每个应该解析同一字符串的后续调用中,str应该为NULL。
strtok
函数在静态变量中保持状态,静态变量在函数调用之间保留。
第一次用第一个参数非NULL调用strtok
时,它知道这是第一次尝试解析这个字符串,所以它会重新开始并记住它在哪里停止。当你用NULL作为第一个参数再次调用它时,它会使用静态变量来恢复它停止的地方
因此,您不能使用strtok
来交换解析两个单独的字符串,也不能在多线程应用程序中使用它。为此,strtok_r
函数更为合适。strtok_r
不使用静态变量,而是使用第三个参数,即"保存指针",用于跟踪它的位置。
需要记住的另一件事是strtok
和strtok_r
修改它们正在解析的字符串。如果您不希望这样做,请创建字符串的副本或使用不同的函数集。
相关文章:
- 这个指针在c++中的用法
- 当C++中需要自动删除时,这是静态的正确用法吗?
- libstdc++ 文件系统中未初始化的用法?
- 复制和交换习惯用法与移动操作之间的交互
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 命名参数习惯用法和(抽象)基类
- 省略号在C++中的所有用法
- () 在 C++ 11 中的特殊而奇怪的用法?
- 构造函数的用法
- 模板类中自动的类用法不完整
- 这里的 = 运算符有什么用法?
- 如何在 c 中使用 2 个 strtok?
- 什么模板用法在阶乘中更好
- 如果可变长度元素的constexpr用法得到<>
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- 难以理解 strtok()
- 访问提升:shared_ptr 主范围外崩溃,断言失败:px != 0.指针的正确用法是什么?
- C++ 中函数中 Const 用法之间的差异
- 字符串上strtok()的C++用法
- 带有NULL的Strtok用法