带你用C语言实现strtok和字符串分割函数

目录
  • 前言
  • 一、strtok的基本使用
  • 二、strtok的实现
  • 总结

前言

字符串分割函数strtok,大家可能都知道他怎么使用,一旦要用的时候就会心生疑惑,不知道它的内部的实现,废话不多说,本篇就来带大家看看strtok的基本使用和实现

一、strtok的基本使用

解析:函数大概说了以下几点

1.str就是我们要去拆分的字符串,注意,我们会对该字符串进行更改,所以一般我们会拷贝一份然后去分割拷贝的那份字符串!!

2.delimiters 就是我们定义的切分的符号,假如想要用空格作为分割符,我们就可以定义 char delimiters [NUM]=" " ** 请注意里面放了一个空格的呀!!
此处NUM可以自己定义大小,这里的delimiters 可以有多种分割方式。

3.strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将会有一个设置保存他修改了的下一个位置的地址,如“wo ai ni”,其中若用空格作为分隔符就会将空格处换成*"\n"**,返回w的位置,并且函数内部保存a的位置。

4.strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置(即上面所说的位置w)开始,查找下一个标记。

5.如果字符串中不存在更多的标记,则返回 NULL 指针。

分析完后我们看一段代码,对一段字符串做一个切割

int main()
{
	char a[] = "wo shi bo zhu";
	char* retArr[10];
	retArr[0] = strtok(a, " ");
	int i = 1;
	while (retArr[i++] = strtok(NULL, " "));
	for (int i = 0; i < 10; i++)
	{
		printf("%s ", retArr[i]);
	}
	return 0;
}

二、strtok的实现

分析:进来的情况大致分为两种,str为空和不为空的情况,函数第一次调用的话因为我们要记录下一次进来时的位置,我们选择在函数内部创建一个static的静态变量,static char* p_last = NULL ,并且第一次我们设置为NULL,函数又分为两种情况,我们切割的话用tmp指针往后走,str指针保存当前位置,所以tmp指针走到\0时我们还要将p_last处理成NULL,其他的情况(str串还能被delimiters分隔)我们就在函数内部把*tmp = ‘\0',再将p_last处理为下一次进来的位置即可

例子:

int main()
{
	char a[] = "wo ai ni";
	char* retArr[10];
	retArr[0] = my_strtok(a, " ");
	int i = 1;
	while (retArr[i++] = my_strtok(NULL, " "));
	for (int i = 0; i < 10; i++)
	{
		printf("%s ", retArr[i]);
	}
	return 0;
}

第一次分割

第二次分割

第三次分割

第四次切割

实现代码如下,有需要自取:

char* my_strtok(char* str, char* delimiters)
{
	//str传NULL的时候如果上次有记录,则用上一次的下一个位置,不然就为NULL
    static char* p_last = NULL;
	if (str == NULL && p_last == NULL)
		return NULL;
	if (str == NULL)
	{
		//用来返回的当前位置
		str = p_last;
		char* tmp = p_last;
		int len = strlen(delimiters);
		while (*tmp)
		{
			for (int i = 0; i < len; ++i)
			{
				if (*tmp == delimiters[i])
				{
					p_last = tmp+1;
					*tmp = '\0';
					return str;
				}
			}
			//走到这里表示当前的tmp没有在delimiters中能找到的
			tmp++;
		}
		//走到这里就是自己走到斜杠\0的位置,就要将p_last 设置成为NULL
		char* ret = p_last;
		p_last = NULL;
		return ret;
	}
	else
	{
		char* tmp = str;
		int len = strlen(delimiters);
		while (*tmp)
		{
			for (int i = 0; i < len; ++i)
			{
				if (*tmp == delimiters[i])
				{
					p_last = tmp+1;
					*tmp = '\0';
					return str;
				}
			}
			//走到这里表示当前的tmp没有在delimiters中能找到的
			tmp++;
		}
		//找到了,找不到
		char* ret = p_last;
		p_last = NULL;
		return ret;
	}
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • 浅谈C语言的字符串分割

    说起来很有意思,自认为对C语言理解得还是比较深刻的.但居然到今天才知道有个strtok函数,试用了一下突然感慨以前做了多少重复劳动.每次需要解析配置文件,每次需要分割字符串,居然都是自己去分割字符串,既累人又容易出错.感概技术学得不够全面啊!这里引用一段strtok用法: The strtok() function returns a pointer to the next "token" in str1, where str2 contains the delimiters that

  • C语言根据协议分割获取字符串单元的实现代码

    协议做如下规定: 规定数据协议: 序列号    长度   状态字   数据长度  数据1  数据2   数据3 以空格作为数据单元. ep:   00001 00007 1 3 34567 26358 32698 (1) (2) (3)(4) (5) (6) (7) 如ep所示: (1)00001就是数字1,即代表序列号为1 (2)00007就是数字7,即代表长度为7 (3)1代表状态字 (4)3代表数字长度 (5)34567代表数据1 (6)26358代表数据2 (7)32698代表数据3 这

  • C语言数据结构实现字符串分割的实例

    C语言数据结构实现字符串分割的实例 以下为"字符串分割"的简单示例: 1. 用c语言实现的版本 #include<stdio.h> /* 根据空格分隔字符串 */ int partition(char *src, char *par, int pos) { int i,j; i = pos; //取到第一个非空格字符 while(src[i] == ' ') { ++i; } if(src[i] != '\0') { j = 0; while((src[i] != '\0'

  • c语言中字符串分割函数及实现方法

    1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

  • C语言中计算字符串长度与分割字符串的方法

    C语言strlen()函数:返回字符串的长度 头文件: #include <string.h> strlen()函数用来计算字符串的长度,其原型为: unsigned int strlen (char *s); [参数说明]s为指定的字符串. strlen()用来计算指定的字符串s 的长度,不包括结束字符"\0". [返回值]返回字符串s 的字符数. 注意一下字符数组,例如 char str[100] = "http://see.xidian.edu.cn/cpp

  • 带你用C语言实现strtok和字符串分割函数

    目录 前言 一.strtok的基本使用 二.strtok的实现 总结 前言 字符串分割函数strtok,大家可能都知道他怎么使用,一旦要用的时候就会心生疑惑,不知道它的内部的实现,废话不多说,本篇就来带大家看看strtok的基本使用和实现 一.strtok的基本使用 解析:函数大概说了以下几点 1.str就是我们要去拆分的字符串,注意,我们会对该字符串进行更改,所以一般我们会拷贝一份然后去分割拷贝的那份字符串!! 2.delimiters 就是我们定义的切分的符号,假如想要用空格作为分割符,我们

  • 一文带你了解C语言中的动态内存管理函数

    目录 1.什么是动态内存管理 2.为什么要有动态内存管理 3.如何进行动态内存管理 3.1 malloc 3.2 free 3.3 calloc 3.4 realloc 总结 1.什么是动态内存管理 平时我们写代码,一种非常常见的写法是: int a = 0; // 创建一个变量 int arr[10] = {0}; // 创建一个数组 当你创建变量a的时候,其实是向内存中申请了4个字节的空间来存放一个整数.而当你创建数组arr的时候,是向内存中申请了40个字节的空间来存放10个整数.当你这么写

  • C语言进阶教程之字符串&内存函数

    目录 前言: 一.求字符串长度 strlen strlen函数的模拟实现 二.长度不受限制的字符串函数 strcpy strcpy函数的模拟实现 strcat strcat函数的模拟实现 strcmp strcmp函数的模拟实现 三.长度受限制的字符串函数 strncpy strncpy函数的模拟实现 strncat strncat函数的模拟实现 strncmp strncmp函数的模拟实现 四.字符串查找 strstr strstr函数的模拟实现 strtok strtok函数的模拟实现 五.

  • C语言详细讲解常用字符串处理函数

    目录 一.strlen() 1. 函数原型: 2. 手动实现: 二.strcat() 1. 函数原型: 2. 手动实现: 三.strcpy() 1. 函数原型: 2. 手动实现: 四.strcmp() 1. 函数原型: 2. 手动实现: 五.memset() 1. 函数原型: 2. 手动实现: 一.strlen() 1. 函数原型: size_t strlen(const char *str) 参数str: 要计算的字符串的长度返回值: 返回字符串 str 的长度,直到遇到结束字符'\0',但不

  • 一篇文章带你了解C语言的一些重要字符串与内存函数

    目录 一.字符串函数 1. 求字符串长度的strlen 2.比较字符串大小的strcmp 3.复制字符串的strcpy 4.追加字符串的strcat 5.查找字符串函数的strstr 二.内存函数 1.复制 memcpy,memmove 2.比较 memcmp 总结 一.字符串函数 1. 求字符串长度的strlen size_t strlen ( const char * str ); 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '

  • 一篇文章带你了解C语言文件操作中的几个函数

    目录 总结 fopen:有两个参数,第一个是要被打开或者被创建的文件名,第二个是以什么方式打开.这两个参数要分别用双引号括起来 打开文件和关闭文件的基本流程,关闭文件之后要置空 fwrite:有四个参数,第一个是指向要被写入的数据的指针,这里是a的地址:第二个参数是被写入项的大小,单位是字节,这里是a的大小:第三个参数是要被写入的项的个数,这里是1,意思是写入一个a:最后一项是FILE结构的指针,这里是pf.这四个参数不需要双引号. 文件指针:. 每个被使用的文件都在内存中开辟了一个相应的文件信

  • 手把手带你走进Go语言之常量解析

    目录 概述 常量 常量计算 iota 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 3 课) 常量 常量 (Constant) 是指程序在执行过程中不会改变的固定值. 常量可以是任何基本数据类型. 如整数常量, 浮点常量, 字符常量, 枚举常量. 常量一般都会被编译器视为常规变量, 只是常量的值不能再定义之后修改. 格式 1: const 变量名 = 值 格式 2: const 变量名 变量类型 例子: package main i

  • 手把手带你走进Go语言之语法基础解析

    目录 概述 Go 语法基础 关键字 标识符 数据类型 变量声明 多变量声明 值类型和引用类型 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. (第 2 课) Go 语法基础 Go 程序可以由多个标记组成: 关键字 标识符 常量 字符串 符号 关键字 Go 语言有 25 个关键字: 关键字 作用 var & const 变量和常量的声明 package & import 导入 func 用于定义函数和方法 return 用于函数返回 d

  • 手把手带你走进Go语言之运算符解析

    目录 概述 Go 运算符 算术运算符 关系运算符 逻辑运算符 赋值运算符 概述 Golang 是一个跨平台的新生编程语言. 今天小白就带大家一起携手走进 Golang 的世界. Go 运算符 运算符 (operator) 可以帮助我们在程序中执行数学或逻辑运算. Go 语言内置的运算符有: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 算术运算符 运算符 描述 + 相加 - 相减 * 相乘 / 相除 % 取余 ++ 自增 – 自减 例子: package main import "f

随机推荐