一、代码片段
- 假设 fin =
-
- “
-
- Name 96
- Name 93
- Name 83
- Name 81
- Name 74
- Name 70
- Name 66
- Name 55
- Name 54
- Name 52
-
- ”
- 代码片段1
-
- p_str = strtok(fin,"\n");
- while(p_str != NULL)
- {
- str_node_array[i] = split_num_from_str(p_str);
- p_str = strtok(NULL,"\n");
- if(p_str == NULL)
- {
-
- printf("p_str == NULL");
-
- break;
-
- }
- else
- printf("iiiiii = %d\n",i);
-
- i++;
- }
- 代码片段2
-
- str_node split_num_from_str(char *p_str)
- {
- char *p_num = NULL;
- str_node s_node;
- strcpy(s_node.str,p_str);
-
- p_num = strtok(s_node.str," ");
-
- p_num = strtok(NULL," ");
- if(p_num != NULL)
- {
- s_node.num = atoi(p_num);
- }
-
- return s_node;
- }
二、 现象分析
这样嵌套使用strtok是不行的,即使split_num_from_str是一个函数!因为上下文中,第一次调用strtok分割一个字符串未完成,又马上开启去分割第二个字符串。当然第二个字符串能够正常分割,而当splite_num_from_str返回的时候,while循环直接被退出的。
三、原因分析
strtok是不可以嵌套调用的!
第一次用strtok分割字符串后,strtok通过一个静态变量后半段字符串的开始地址,这就是可以通过NULL来进行第二次操作的原因。当嵌套调用后,那个静态变量被修改了,应该是被置为NULL了,当然无法进行下一个调用了!
要对上面的字符串进行分割,建议使用strtok_r(char *buf,const char *delim,char **ptrptr);