分割函数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的基本使用方法

  1. 第一次调用strtok(),传入的参数str是要被分割的字符串{aaa - bbb -ccc},而成功后返回的是第一个子字符串{aaa};

  2. 而第二次调用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相关推荐

  1. 字符串分割函数strtok和strsep使用注意事项

    转载自 https://blog.csdn.net/astrotycoon/article/details/50813959 为什么写本文 最近工作中经常需要解析字符串,并且这些字符串都有一个共同的特 ...

  2. 字符串分割函数--strtok与strsep

    在c/c++中,字符串分割函数主要有两种:一是strtok函数,另一个就是strsep函数.下面我们对这两个函数作一个详细解释说明. 1.strtok 原形: char* strtok(char *s ...

  3. C++/C--字符串分割函数 --strtok()

    char * strtok (char * str, const char * delimiters); 函数说明 strtok()用来将字符串分割成一个个片段.参数str指向欲分割的字符串,参数de ...

  4. javascript里你绝对用的上的字符分割函数--原创

    // 在数组内字符为未知情况下,合并和分割的解决方案 var data = [['your name', 'myvalue'], ['myr name', 'thivalue']];function ...

  5. java 字符分割函数_java中的字符串分割函数

    Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面是string.split的用法实例及注意事项: java.lang.string.split split ...

  6. strtok(), strtok_s() 字符串分割函数

    strtok(), strtok_s() 字符串分割函数 //strtok()函数原型/*_Check_return_ _CRT_INSECURE_DEPRECATE(strtok_s) _CRTIM ...

  7. PHP字符串分割函数explode,strtok,str_spli的用法

    PHP字符串函数在PHP网站开发中广泛使用,比如使用PHP字符串函数对字符串分割.截取.匹配.替换等处理.PHP字符串函数对于PHP入门学习者来说必不可少,本文将主要介绍PHP字符串分割函数处理心得, ...

  8. C++实现字符串分割函数split()

    目录 使用strtok()完成分割 使用strsep()完成分割 使用strtok_r()完成分割 实现字符串分割 前言 最近遇到了一个字符串分割的问题,在C++的标准库里面没有字符分割函数split ...

  9. C++ 字符串分割函数

    平时刷 leetcode .剑指 offer 等可能不会用到,但在找工作做笔试题的过程中还是会经常用到的,C++标准库里面没有字符分割函数split,这里做个总结. 方法1.利用 STL 实现 #in ...

  10. C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解

    字符串分割情况 读取文件时,C++识别的是空格和换行符,但有时候文件是以符号分割的,如逗号等 字符串本身含有特殊符号,如逗号,@等 strtok()函数 strtok()函数能够按照特定的字符分解字符 ...

最新文章

  1. android java style_Android 在Java代码中设置style属性--使用代码创建ProgressBar对象
  2. NPM:nodejs官方包管理工具的简介、安装、使用方法之详细攻略
  3. python可变参数记录
  4. Minimum Triangulation
  5. VC系统扫雷游戏外挂源代码程序下载(转帖
  6. Zabbix-3.0.0 安装Graphtree
  7. 015-请问如果想进行bug的测评,怎么去评测bug?
  8. mac版有道云笔记切换笔记后内容仍展示前一个笔记内容问题解决
  9. 频率与振幅的关系图怎么画_手拉手模型怎么画?5步教你分分钟完成模型图
  10. 计算机组成原理——第五章
  11. 4775电子书免费链接
  12. matlab mac 更改语言,MAC让Matlab编辑器显示中文的方法
  13. CAD转CAD注意事项
  14. maxon motor 471486电机
  15. redmine使用指南_Redmine安装与入门指南
  16. P1296 分形宇宙
  17. AdGuard自定义拦截规则
  18. 这台计算机没有连接到网络怎么办,通过路由器连接电脑连不上网怎么办_台式连接路由器没有网解决方法-系统城...
  19. steam游戏文件夹在哪儿?
  20. gym102028 problem E Resistors in Parallel (大数)

热门文章

  1. Spark 小文件合并优化实践
  2. python买卖股票_Python实现买卖股票的最佳时机的一种方法
  3. 在Windows x64中加载驱动
  4. invalid index of a 0-dim tensor
  5. 同源策略——CORS和JSONP劫持漏洞
  6. linpack测试软件,服务器性能测试(linpack,stream,netperf,iometer)
  7. R/ggplot2保存图片中文字体至PDF——showtext包一文清除所有障碍
  8. Mac技巧之 Numbers 排除重复表格(去重)方法
  9. python淘宝秒拍_(python)下载秒拍美拍视频
  10. 红蓝对抗——蓝军(CheckList)总结