strtok的缺陷

简介: 一、代码片段 假设 fin = “ Name 96 Name 93 Name 83 Name 81...

一、代码片段


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

相关文章
|
3月前
|
人工智能
智能体(AI Agent)开发实战之【Coze】(一)治愈和疗愈系图文一键量产
智能体(AI Agent)开发实战之【Coze】(一)治愈和疗愈系图文一键量产(附保姆级工作流)
智能体(AI Agent)开发实战之【Coze】(一)治愈和疗愈系图文一键量产
|
设计模式 机器学习/深度学习 SQL
软考高级系统架构设计师通关经验分享
为什么考系统架构设计师是国家设立的计算机技术与软件专业技术资格考试(简称软考)中的一个高级科目,属于工程师高级职称系列,具有一定含金量。浙江省每年通过软考高级的人数约为1000+人,其中系统架构设计师科目的通过人数约为200+人。从学习角度来说,通过准备系统架构设计师的考试的过程,可以查漏补缺,并且了解一些系统架构设计相关的基础知识,实现一定程度上的自我提升;从目的性的角度来说,通过考试,可以在一
14562 4
软考高级系统架构设计师通关经验分享
|
JavaScript Java 关系型数据库
Springboot+vue的校园社团管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
Springboot+vue的校园社团管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。
通过patch-package创建补丁修改node_modules依赖下的源码
通过patch-package创建补丁修改node_modules依赖下的源码
371 0
|
机器学习/深度学习 人工智能 自动驾驶
ONNX 在多模态应用中的角色
【8月更文第27天】随着人工智能技术的发展,多模态学习成为了一个热门的研究方向。多模态学习指的是结合多种不同类型的数据(如图像、文本和音频等)进行建模,以提取更丰富的信息并做出更准确的预测。Open Neural Network Exchange (ONNX) 作为一种开放的标准,支持多种机器学习框架之间的模型交换,为多模态应用的开发提供了强大的支持。本文将探讨 ONNX 在多模态应用中的作用,并通过具体的代码示例来展示如何利用 ONNX 来实现图像、文本和音频数据的融合处理。
511 1
|
11月前
|
关系型数据库 MySQL Java
MySQL数据锁:Record Lock,Gap Lock 和 Next-Key Lock
本文基于 MySQL 8.0.30 版本及 InnoDB 引擎,深入解析三种行锁机制:记录锁(Record Lock)、间隙锁(Gap Lock)和临键锁(Next-key Lock)。记录锁锁定索引记录,确保事务唯一修改;间隙锁锁定索引间的间隙,防止新记录插入;临键锁结合两者,锁定范围并记录自身,有效避免幻读现象。通过具体示例展示了不同锁的作用机制及其在并发控制中的应用。
1077 2
|
算法 编译器 测试技术
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
跨平台构建的艺术:使用 CMake 实现项目移植的全面指南
598 5
|
数据安全/隐私保护 Android开发 芯片
wpa_supplicant介绍
wpa_supplicant介绍
236 1
|
监控 关系型数据库 MySQL
Flink CDC产品常见问题之look up hint 没有生效如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
1246 1
|
安全 Unix Linux
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
【C/C++ 字符串】探索C语言之字符串分割函数:strtok和strsep的区别
471 0