c语言的split字符串分割(函数strtok)

news/2024/11/25 14:26:24/

1、说明:

在C语言中实现对字符串的分割(多亏了strtok函数)

2、案例讲解

1、Strtok()函数详解: 该函数包含在"string.h"头文件中

1) 函数原型: char* strtok (char* str,constchar* delimiters );
2) 函数功能: 切割字符串,将str切分成一个个子串
3) 函数参数:

str:在第一次被调用的时间str是传入需要被切割字符串的首地址;在后面调用的时间传入NULL。
delimiters:表示切割字符串(字符串中每个字符都会 当作分割符)。

4) 函数返回值:

当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\n",temp);temp = strtok(NULL,"@");}return 0;
}

上述代码运行结果:
在这里插入图片描述

结论:
strtok在切割字符串的时间,实际上就是将分割符的字符delimiter替换为'\0'并且返回首地址。

2、自己实现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 +1;}//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存储类型的变量,这种函数将是不可重入函数。它在实时系统中是不安全函数


http://www.ppmy.cn/news/430662.html

相关文章

机械键盘上的ASF是什么意思?

机械键盘上的ASF是什么意思&#xff1f; 坑 A代表的是大小写&#xff1b; S代表的是ScrLK键&#xff1b; F代表的是Fn; ROG键盘的键盘标识

C语言字符串分割:strtok、strtok_r

头文件include <string.h> 一、strtok 原型 char *strtok(char s[], const char *delim); 参数与功能 分解字符串为一组字符串。s为要分解的字符串&#xff1b;delim为分隔符字符串。 例如&#xff1a; strtok("abc,def,ghi",",") 表示将字符…

clrscr()

今天在网上看了一个程序&#xff0c;里面有这个程序clrscr()&#xff0c;因为本人一直不是很喜欢turboc&#xff0c;在别的编译器下面写程序&#xff0c;怎么调试也不合适&#xff01;在百度上搜索了一下&#xff0c;原来此函数只能用在turboc&#xff0c;现在分享出来&#xf…

iScroll

一、iScroll基本使用 1.1 什么是iScroll? iScroll是一个高性能&#xff0c;资源占用少&#xff0c;无依赖&#xff0c;多平台的javascript滚动插件。iScroll不仅仅是滚动。在你的项目中包含仅仅4kb大小的iScroll&#xff0c;能让你的项目便拥有滚动&#xff0c;缩放&#xf…

C语言-字符串分割函数strtok()

最近项目开发比较忙&#xff0c;离上一次更新已经过去一个多月了&#xff0c;项目完成的差不多了&#xff0c;其中有一个黑白名单阻断的需求&#xff0c;刚开始我是用的指针偏移&#xff0c;一个字节一个字节的去匹配&#xff0c;由于业务很多&#xff0c;觉得这样写太繁琐了&a…

python实现自动打开终端并执行命令(windows)

python实现自动打开终端并执行代码&#xff08;windows&#xff09; 一、环境和代码1. 安装pypiwin322. 代码示例 二、效果展示三、存在问题1. ImportError: DLL load failed while importing win32api: 找不到指定的模块。2. 窗口打开了但是不输入命令 最近有同学需要同时打开…

scorll

关闭 微信平台 <script type"text/javascript">function closeDiv() {document.getElementById(floater).style.visibility hidden;}self.onError null;currentX currentY 0;whichIt null;lastScrollX 0; lastScrollY 0;NS (document.layers) ? 1 : 0…

scoket

我们深谙信息交流的价值&#xff0c;那网络中进程之间如何通信&#xff0c;如我们每天打开浏览器浏览网页 时&#xff0c;浏览器的进程怎么与web服务器通信的&#xff1f;当你用QQ聊天时&#xff0c;QQ进程怎么与服务器或你好友所在的QQ进程通信&#xff1f;这些都得靠socket&a…