Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14534596
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类: C/C++

2012-11-02 20:29:35

一、代码片段


  1. 假设 fin =

  2. “

  3. Name 96
  4. Name 93
  5. Name 83
  6. Name 81
  7. Name 74
  8. Name 70
  9. Name 66
  10. Name 55
  11. Name 54
  12. Name 52

  13. ”

  1. 代码片段1

  2. p_str = strtok(fin,"\n");
  3. while(p_str != NULL)
  4. {
  5.     str_node_array[i] = split_num_from_str(p_str);
  6.     p_str = strtok(NULL,"\n");
  7.     if(p_str == NULL)
  8.     {

  9.         printf("p_str == NULL");

  10.         break;

  11.     }
  12.     else
  13.         printf("iiiiii = %d\n",i);

  14.     i++;
  15. }


  1. 代码片段2

  2. str_node split_num_from_str(char *p_str)
  3. {
  4.     char *p_num = NULL;
  5.     str_node s_node;
  6.     strcpy(s_node.str,p_str);

  7.     p_num = strtok(s_node.str," ");

  8.     p_num = strtok(NULL," ");
  9.     if(p_num != NULL)
  10.     {
  11.         s_node.num = atoi(p_num);
  12.     }

  13.     return s_node;
  14. }


二、 现象分析

这样嵌套使用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);

阅读(3143) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

Bean_lee2013-01-03 19:07:43

strtok这个函数基本不能用在工程代码中,不安全。