字符串函数之Strtok()函数
Strtok()函数详解:
该函数包含在"string.h"头文件中
函数原型:
char* strtok (char* str,constchar* delimiters );
函数功能:
切割字符串,将str切分成一个个子串
函数参数:
str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。
函数返回值:
当s中的字符查找到末尾时,返回NULL;
如果查不到delimiter所标示的字符,则返回当前strtok的字符串的指针。
使用strtok()函数:
#include<stdio.h>
#include<string.h>
int main(void)
{
char buf[]="hello@boy@this@is@heima";
char*temp = strtok(buf,"@");
while(temp)
{
printf("%s ",temp);
temp = strtok(NULL,"@");
}
return0;
}
预计输出结果:
"hello boy this is heima "
实际运行结果:

得到的结论:
strtok在切割字符串的时间,实际上就是将分割符的字符delimiter替换为'\0'并且返回首地址。
自己实现strtok()函数原理:
函数代码:
#include<stdio.h>
#include<string.h>
//根据函数原型实现strtok()函数
char* myStrtok_origin(char* str_arr,constchar* delimiters,char**temp_str)
{
//定义一个指针来指向待分解串
char*b_temp;
/*
* 1、判断参数str_arr是否为空,如果是NULL就以传递进来的temp_str作为起始位置;
* 若不是NULL,则以str为起始位置开始切分。
*/
if(str_arr == NULL)
{
str_arr =*temp_str;
}
//2、跳过待分解字符串
//扫描delimiters字符开始的所有分解符
str_arr += strspn(str_arr, delimiters);
//3、判断当前待分解的位置是否为'\0',若是则返回NULL,否则继续
if(*str_arr =='\0')
{
return NULL;
}
/*
* 4、保存当前的待分解串的指针b_temp,调用strpbrk()在b_temp中找分解符,
* 如果找不到,则将temp_str赋值为待分解字符串末尾部'\0'的位置,
* b_temp没有发生变化;若找到则将分解符所在位置赋值为'\0',
* b_temp相当于被截断了,temp_str指向分解符的下一位置。
*/
b_temp = str_arr;
str_arr = strpbrk(str_arr, delimiters);
if(str_arr == NULL)
{
*temp_str = strchr(b_temp,'\0');
}
else
{
*str_arr ='\0';
*temp_str = str_arr +;
}
//5、函数最后部分无论找没找到分解符,都将b_temp返回。
return b_temp;
}
//使用myStrtok来简化myStrtok_origin函数
char* myStrtok(char* str_arr,constchar* delimiters)
{
staticchar*last;
return myStrtok_origin(str_arr, delimiters,&last);
}
int main(void)
{
char buf[]="hello@boy@this@is@heima";
//1、使用myStrtok_origin()函数
char*temp_str = NULL;
char*str = myStrtok_origin(buf,"@",&temp_str);
while(str)
{
printf("%s ",str);
str = myStrtok_origin(NULL,"@",&temp_str);
}
//2、使用myStrtok()函数
char*str1 = myStrtok(buf,"@");
while(str1)
{
printf("%s ",str1);
str1 = myStrtok(NULL,"@");
}
return0;
}
完美实现!!!
拓展知识点:可重入与不可重入函数
可重入函数:
指一个可以被多个任务调用的函数(过程),任务在调用时不必担心数据是否会出错。
不可重入函数:
如果函数接口的代码实现中在块内定义和使用了static存储类型的变量,这种函数将是不可重入函数。它在实时系统中是不安全函数
字符串函数之Strtok()函数的更多相关文章
- shell脚本调用C语言之字符串切分之strtok函数
今天上午在写一个需求,要求的比较急,要求当天完成,我大致分析了一下,可以采用从shell脚本中插入一连串的日期,通过调用proc生成的可执行文件,将日期传入后台数据库,在数据库中进行计算.需要切分日期 ...
- c语言字符串操作,及常用函数
一,字符串操作 1 . strcpy : 拷贝 char *stpcpy(char *destin, char *source); 2 . strcat : 拼接 char *strcat(char ...
- STRTOK函数和STRTOK_R函数
STRTOK函数和STRTOK_R函数 注:本文转载自博客园,感谢作者整理! 1.一个应用实例 网络上一个比较经典的例子是将字符串切分,存入结构体中.如,现有结构体 typedef struct pe ...
- [转载]strtok函数和strtok_r函数
1.一个应用实例 网络上一个比较经典的例子是将字符串切分,存入结构体中.如,现有结构体 typedef struct person{ char name[25]; char sex[1 ...
- php中_initialize()函数与 __construct()函数的区别说明
_initialize()方法是在任何方法执行之前,都要执行的,当然也包括 __construct构造函数. 也就是说如果存在_initialize()函数,调用对象的任何方法都会导致_initial ...
- C语言strtok()函数:字符串分割
头文件:#include <string.h> 定义函数:char * strtok(char *s, const char *delim); 函数说明:strtok()用来将字符串分割成 ...
- C/C++ 字符串分割: strtok 与 strsep 函数说明
函数原型: char *strtok(char *s, const char *delim); char *strsep(char **s, const char *delim); 功能:strtok ...
- 用strtok函数分割字符串
用strtok函数分割字符串 需要在loadrunner里面获得“15”(下面红色高亮的部分),并做成关联参数. //Body response 内容: <BODY><; PRE&g ...
- 使用 内置函数strtok()函数实现 loadrunner 字符串替换
Action(){ /* loadrunner 字符串替换 */ char separators[] = "/"; char * token; char * file_path; ...
随机推荐
- Spring Cloud Data Flow 中的 ETL
Spring Cloud Data Flow 中的 ETL 影宸风洛 程序猿DD 今天 来源:SpringForAll社区 1 概述 Spring Cloud Data Flow是一个用于构建实时数据 ...
- vue实战记录(一)- vue实现购物车功能之前提准备
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(一) GitHub:sue ...
- PHP 加解密方法大全
最近看见一篇文章讲的是PHP的加解密方法,正好也自己学习下,顺便以后有用到的地方也好能快速用上,仅供自己学习和复习,好了不多BB,上代码. 基于这几个函数可逆转的加密为:base64_encode() ...
- Python之路(第十七篇)logging模块
一.logging模块 (一).日志相关概念 日志是一种可以追踪某些软件运行时所发生事件的方法.软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情.一个事件可以用一个可包含可选变 ...
- 金融量化分析【day112】:因子选股
一.因子选股基础 二.因子选股策略实现代码 # 导入函数库 import jqdata import psutil #初始化函数,设定基准等等 def initialize(context): set ...
- 深入剖析Kubernetes学习笔记:开篇词(00)
一.关于Kubernetes初学的疑惑 就在这场因"容器"而起的技术变革中,kubernetes项目已经成为容器技术的事实标准,重新定义了基础设置领域对应用编排与管理的种种可能 1 ...
- Docker下安装Jenkins
Docker安装参见:https://www.cnblogs.com/hackyo/p/9280042.html 安装Jenkins: docker run \ -u root \ --rm \ -d ...
- cmd 命令添加防火墙端口
windows dos 命令添加防火墙端口. 示例 123 端口: netsh firewall add portopening protocol = UDP port = name = NTPSER ...
- react-router(v4) 路由跳转后返回页面顶部问题
遇到的问题 由A页面跳转到B页面,B页面停留在A页面的位置,没有返回到顶部. 问题分析 首先分析下出现此问题的原因: 在项目中使用的是 hashHistory,它是建立在 history 之上的,当路 ...
- dubbo和zikkeper的使用
1.先来一段异常看看:No provider available for the service 16:05:25.755 [localhost-startStop-1] WARN o.s.w.c.s ...