一、代码片段
-
假设 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);
阅读(2912) | 评论(1) | 转发(0) |