当前位置: 首页 > web >正文

strtok()字符串分隔函数

1函数定义

#include <string.h>
char *strtok(char *str, const char *delim);

2函数说明

2.1入口参数

char *str:第一次调用传入strtok时需要传入将被分隔的字符串。后续调用只需传入NULL即可。

char *delimstrtok根据该参数中的分隔符来对str中的字符串进行分隔,这个参数可以有多个字符。

2.2返回值

返回被分隔后的字符串的指针。

3代码举例

#include <stdio.h>
#include <string.h>int main()
{char str[] = "This is    test,code ha@haa";char *token;int num = 0;const char s[3] = " ,@";   // str will be break by ' ' and ',' and '@' character/* get the first string */token = strtok(str, s);    // after this line, the str would be distroyed/* get the follows strings */while(token != NULL) {    //when strtok return NULL, end of string is reachednum++;printf("token = %s\n", token);printf("%d called. str = %s\n\n", num, str); // you can find that str is destoriedtoken = strtok(NULL, s);  // first param set NULL is OK.}return 0;
}

上面这段代码是有问题的,测试结果没任何输出,但是只需要修改一个地方就可以了,你知道问题在哪吗?为什么会出问题?

答案:因为代码第9行" ,@"这段字符串常量在内存中是以如下方式存储的:

  • ' '(空格)
  • ','
  • '@'
  • '\0'

但是const char s[3]只有三个字符空间所以没有'\0'结束符,导致strtok无法正确识别分隔符。

如果修改const char s[3]const char s[4]const char s[]问题就解决了。运行后打印输出如下:

token = This
1 called. str = Thistoken = is
2 called. str = Thistoken = test
3 called. str = Thistoken = code
4 called. str = Thistoken = ha
5 called. str = Thistoken = haa
6 called. str = This

4需要注意的点

通过打印你也可以发现,原来的字符串char str[]被破坏了,实验发现,strtok(str, s);被调用后,str的第一个分隔符对应的位置被替换成了\0结束符。如果要保持原字符串的完整,可以使用strchrsscanf的组合等(没太明白)。

http://www.xdnf.cn/news/19501.html

相关文章:

  • VideoPoet:Google发布的用于视频生成的大语言模型
  • 【C#】在一个任意旋转的矩形(由四个顶点定义)内绘制一个内切椭圆
  • SpringAI应用开发面试实录:核心技术、架构设计与业务场景全解析
  • 华为研发投资与管理实践(IPD)读书笔记
  • VSCode `tasks.json` 中 `tasks` 数组的详细解析
  • 语义分析:从读懂到理解的深度跨越
  • Photoshop - Ps 标尺
  • JVM参数配置调优指南
  • 在开发过程中经常遇到 OOM(内存溢出)问题,如何解决?
  • 解决IDEA 2025.2升级报错:Scannning Files to Index卡住问题分析与修复
  • 设计模式:外观模式(Facade Pattern)
  • 【Proteus仿真】开关控制系列仿真——开关控制LED/拨码开关二进制计数/开关和继电器控制灯灭
  • 第3章 乱码的前世今生-字符集和比较规则
  • 常见线程池的创建方式及应用场景
  • 将基于 Spring Boot 3.0.0 的 JavaWeb 应用部署到腾讯云并配置域名
  • Iterative loop of ML development|机器学习的迭代发展
  • C#基础(②音乐播发器MCI(Media Control Interface))
  • MySQL 常用语法
  • PortSwigger靶场之Stored XSS into HTML context with nothing encoded通关秘籍
  • Spring Boot 3.x 微服务架构实战指南
  • k8s中 discovery-token和token 的区别
  • Openstack Eproxy 2025.1 安装指南
  • 基于OpenCv做照片分析应用一(Java)
  • 学习记录(二十二)--Overleaf中生成的PDF左上角1.5em问题
  • 【AI编程工具】使用Cursor快速搭建一套小型项目管理系统
  • Elasticsearch vs Solr vs OpenSearch:搜索引擎方案对比与索引设计最佳实践
  • 微服务的编程测评系统18-判题功能-Rabbitmq-用户拉黑
  • 7.2elementplus的表单布局与模式
  • 从零到一:使用anisble自动化搭建kubernetes集群
  • 代码随想录算法训练营五十三天|图论part11