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

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.dtcms.com/a/360322.html

相关文章:

  • OpenStack 01:介绍
  • Batch Normalization 批归一化
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享1
  • AI辅助编程日记和chat历史开源Series 1:VSCode + GitHub Copilot 自动下载及安装软件
  • 大模型训练全流程
  • 在deepseek v3.1上加自信度参数的外挂方案,plugin,朝向一步一步
  • [光学原理与应用-361]:ZEMAX - 分析 - 像差分析
  • Win32学习笔记 | recv函数
  • MVC架构模式
  • XXL-JOB任务执行The access token is wrong问题分析解决及原理源码解析
  • 【Linux】linux进程 vs 线程
  • 《WINDOWS 环境下32位汇编语言程序设计》第9章 通用控件(2)
  • Modbus CRC16校验码在线计算器
  • Python训练营打卡Day49-神经网络调参指南
  • 大模型参数量与计算量(FLOPs)估算方法
  • [WUSTCTF2020]B@se1
  • 后向投影合成孔径辐射源定位方法(一)
  • Linux-数据库
  • MVC模式学习
  • 物种多样性与物种丰富度
  • 制造业生产线连贯性动作识别系统开发
  • 使用 Claude Code 与 Remotion 制作自定义动画视频的完整教程
  • 代码分析之符号执行技术
  • 多人协作开发指南二
  • 简化对齐训练:用明文对比数据SFT替代复杂DPO
  • 8针脚的1.8寸IIC接口的TFT彩屏的八个引脚都需要使用吗?
  • 【编号186】中国劳动统计年鉴(1991-2023)
  • LeetCode 2570.合并两个二维数组
  • 超越关键词:RAG系统如何破解用户查询的“模糊密码”
  • BLE广播与扫描