我正在学习使用C标准函数进行字符串操作。当我学习这些东西时,我面临着strtok函数和以下代码。
#include <string.h>
#include <stdio.h>
int main()
{
char str[80] = "This is - www.tutorialspoint.com - website";
const char s[2] = "-";
char *token;
/* get the first token */
token = strtok(str, s);
/* walk through other tokens */
while( token != NULL )
{
printf( " %s\n", token );
token = strtok(NULL, s);
}
return(0);
}
我不明白为什么在while循环中,strtok与null一起使用?为什么在这里使用null?因为在strtok函数定义中有类似的东西(这个函数使用第二个参数将第一个参数字符串分解为一系列标记。)
答案 0 :(得分:7)
因为它使用了一个指向你正在使用的字符串的内部static
指针,所以如果你想让它在同一个字符串上运行,你只需要用NULL
作为第一个参数调用它并让它使用它的内部指针。如果使用非null第一个参数调用它,那么它将使用新指针覆盖指针。
这反过来意味着strtok()
不可重入。所以你通常只是在简单的情况下使用它,更复杂的情况,重入是重要的(像多线程程序,或处理多个字符串)需要不同的方法。
一种方法是在POSIX系统上,你可以使用strtok_r()
一个额外的参数来使用,因为它是&#34; 内部&#34;指针。
检查this manual以了解更多信息。
答案 1 :(得分:4)
strtok
使用内部(静态)状态来标记字符串。当使用NULL调用时,它将转到第一次调用中传递的字符串中的下一个标记。
值得一提的是,这个属性(内部状态)使得在多线程环境中使用它是不安全的。更安全的版本是strtok_r
,它将状态作为输出参数返回。
答案 2 :(得分:2)
第一个调用你使用一个char数组,它包含你想要解析的元素。
第二次调用它时,你传递它NULL
作为第一个参数来告诉函数从字符串中的最后一个点恢复。一旦第一次调用,您的char
数组就会收到解析后的字符串。如果你没有放NULL
,你就会失去你的位置,并有效地丢失你的字符串的最后一部分。
char * c_Ptr = NULL; //temp hold indivisual sections
char c_Ptr1[1000] = {NULL};
fgets(c_Ptr1, 1000, f_ptr); //Grabs a line from an open file
strtok(c_Ptr1, ","); //first one starts at the beginning
c_Ptr = strtok(NULL, ",");