Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12839137
  • 博文数量: 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. Name 96
  3. Name 93
  4. Name 83
  5. Name 81
  6. Name 74
  7. Name 70
  8. Name 66
  9. Name 55
  10. Name 54
  11. Name 52


  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);

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

Bean_lee2013-01-03 19:07:43

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