字符分割函数strtok
分割函数strtok
- 一、strtok()基本使用和介绍
- 二、strtok()注意事项
- 三、strtok()函数源码
一、strtok()基本使用和介绍
1、函数原型
char *strtok(char *str, const char *delim)
2、参数
- str—要被分解的字符串
- delim—用作分隔符的字符(可以是一个,也可以是集合)
3、返回值
- 该函数返回被分解的第一个子字符串,若无可检索的字符串,则返回空指针
4、实例代码
#include <string.h>
#include <stdio.h>int main () {char str[80] = "aaa - bbb - ccc";const char s[2] = "-"; //字符串里可以是一个分隔符,也可以是分隔符的集合char *token;/* 获取第一个子字符串 */token = strtok(str, s);/* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);
}
编译运行
在这里我们可以看出strtok的基本使用方法:
第一次调用strtok(),传入的参数str是要被分割的字符串{aaa - bbb -ccc},而成功后返回的是第一个子字符串{aaa};
而第二次调用strtok的时候,传入的参数应该为NULL,使得该函数默认使用上一次未分割完的字符串继续分割 ,就从上一次分割的位置{aaa-}作为本次分割的起始位置,直到分割结束。
二、strtok()注意事项
(1)delim 替换成 \0
- 在这个函数里strtok()在分解字符串的时候,第一个参数str是在不断变化的,这个函数是在改变原字符串,把原字符串{aaa - bbb - ccc}通过第二个参数delim将所有的分割符{-}替换成字符串结束标志字符{\0},则原字符串变化为{aaa \0 bbb \0 ccc}
- 错误示例:
#include <string.h>
#include <stdio.h>int main () {char *str = "aaa - bbb - ccc"; //****注意这里!const char s[2] = "-";char *token;/* 获取第一个子字符串 */token = strtok(str, s);/* 继续获取其他的子字符串 */while( token != NULL ) {printf( "%s\n", token );token = strtok(NULL, s);}return(0);
}
注意:在这里,我实现函数的时候将字符串数组直接用指针指向它了,结果运行错误,后面发现虽然第一个参数是可以传指针,但我们要考虑空间内存布局,在strtok()函数里是delim的{分隔符}替换{ \0}改变原字符串,而我们用指针指向这个字符串的时候,其实指向的是字符串常量,它的内存分布在文字常量区是不可被改变的,所以出现了错误!
(2)delim分隔符
- strtok()的第二个参数delim,我看了很多博客都使用一个分隔符的示例,其实delim里可以是所有分隔符的集合,比如{aaa - bbb ; ccc | ddd},第二个参数delim可以是{-;|},用一个或多个分隔符去分解字符串都可以
(3)delim分隔符可不可以出现在第一个字符?
- 答案是:可以
当strtok分解的字符串首字符就是分隔符,那么strtok()会忽略首个分隔符,直接从第二个分隔符往下继续分解,例如:{- aaa - bbb - ccc} 那么strtok()会忽略第一个{-},还是以{aaa - bbb - ccc}的字符串形式继续分解。
三、strtok()函数源码
有的小伙伴可能想了解源码,在这里也贴上
char *strtok(char *str,const char *delim)
{static char *next_start = NULL; //保存到静态存储区,函数返回后不会被销毁if(str == NULL && (str = next_start) == NULL){return NULL;}char *s = str;const char *t = NULL;while(*s){t = delim;while(*t){if(*t == *s){next_start = s + 1;if(s == str) //第一个字符就是分隔符{str = next_start;break;}else{*s = '\0';return str;}}else{t++;}}s++;}return NULL;
}
关于这个函数在项目编程中需要经常使用,所以就搜集资料整理成自己的学习笔记了,如有不对,留言改正!
字符分割函数strtok相关推荐
- 字符串分割函数strtok和strsep使用注意事项
转载自 https://blog.csdn.net/astrotycoon/article/details/50813959 为什么写本文 最近工作中经常需要解析字符串,并且这些字符串都有一个共同的特 ...
- 字符串分割函数--strtok与strsep
在c/c++中,字符串分割函数主要有两种:一是strtok函数,另一个就是strsep函数.下面我们对这两个函数作一个详细解释说明. 1.strtok 原形: char* strtok(char *s ...
- C++/C--字符串分割函数 --strtok()
char * strtok (char * str, const char * delimiters); 函数说明 strtok()用来将字符串分割成一个个片段.参数str指向欲分割的字符串,参数de ...
- javascript里你绝对用的上的字符分割函数--原创
// 在数组内字符为未知情况下,合并和分割的解决方案 var data = [['your name', 'myvalue'], ['myr name', 'thivalue']];function ...
- java 字符分割函数_java中的字符串分割函数
Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面是string.split的用法实例及注意事项: java.lang.string.split split ...
- strtok(), strtok_s() 字符串分割函数
strtok(), strtok_s() 字符串分割函数 //strtok()函数原型/*_Check_return_ _CRT_INSECURE_DEPRECATE(strtok_s) _CRTIM ...
- PHP字符串分割函数explode,strtok,str_spli的用法
PHP字符串函数在PHP网站开发中广泛使用,比如使用PHP字符串函数对字符串分割.截取.匹配.替换等处理.PHP字符串函数对于PHP入门学习者来说必不可少,本文将主要介绍PHP字符串分割函数处理心得, ...
- C++实现字符串分割函数split()
目录 使用strtok()完成分割 使用strsep()完成分割 使用strtok_r()完成分割 实现字符串分割 前言 最近遇到了一个字符串分割的问题,在C++的标准库里面没有字符分割函数split ...
- C++ 字符串分割函数
平时刷 leetcode .剑指 offer 等可能不会用到,但在找工作做笔试题的过程中还是会经常用到的,C++标准库里面没有字符分割函数split,这里做个总结. 方法1.利用 STL 实现 #in ...
- C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解
字符串分割情况 读取文件时,C++识别的是空格和换行符,但有时候文件是以符号分割的,如逗号等 字符串本身含有特殊符号,如逗号,@等 strtok()函数 strtok()函数能够按照特定的字符分解字符 ...
最新文章
- android java style_Android 在Java代码中设置style属性--使用代码创建ProgressBar对象
- NPM:nodejs官方包管理工具的简介、安装、使用方法之详细攻略
- python可变参数记录
- Minimum Triangulation
- VC系统扫雷游戏外挂源代码程序下载(转帖
- Zabbix-3.0.0 安装Graphtree
- 015-请问如果想进行bug的测评,怎么去评测bug?
- mac版有道云笔记切换笔记后内容仍展示前一个笔记内容问题解决
- 频率与振幅的关系图怎么画_手拉手模型怎么画?5步教你分分钟完成模型图
- 计算机组成原理——第五章
- 4775电子书免费链接
- matlab mac 更改语言,MAC让Matlab编辑器显示中文的方法
- CAD转CAD注意事项
- maxon motor 471486电机
- redmine使用指南_Redmine安装与入门指南
- P1296 分形宇宙
- AdGuard自定义拦截规则
- 这台计算机没有连接到网络怎么办,通过路由器连接电脑连不上网怎么办_台式连接路由器没有网解决方法-系统城...
- steam游戏文件夹在哪儿?
- gym102028 problem E Resistors in Parallel (大数)
热门文章
- Spark 小文件合并优化实践
- python买卖股票_Python实现买卖股票的最佳时机的一种方法
- 在Windows x64中加载驱动
- invalid index of a 0-dim tensor
- 同源策略——CORS和JSONP劫持漏洞
- linpack测试软件,服务器性能测试(linpack,stream,netperf,iometer)
- R/ggplot2保存图片中文字体至PDF——showtext包一文清除所有障碍
- Mac技巧之 Numbers 排除重复表格(去重)方法
- python淘宝秒拍_(python)下载秒拍美拍视频
- 红蓝对抗——蓝军(CheckList)总结