当前位置: 首页 > news >正文

字符串函数【C语言-3】

❤️订阅专栏:字符串函数

💚关注博主:翻斗花园第一代码手牛爷爷

目录

  • 🐳前言
  • 🌸函数介绍
    • 🍀[strtok函数](https://legacy.cplusplus.com/reference/cstring/strtok/?kw=strtok)
      • 🌺strtok函数使用
      • ▶️strtok函数模拟实现
    • 🌈[strerror函数](https://legacy.cplusplus.com/reference/cstring/strerror/?kw=strerror)
      • ⛵️strerror函数使用
  • ✈️总结

🐳前言

续上第二篇,我们接下来继续介绍几种字符串函数,想要熟练的运用字符串函数,对函数的一些实现细节的了解是必不可少的。除此之外,跟应该多加练习,敲起来!

🌸函数介绍

🍀strtok函数

char * strtok ( char * str, const char * delimiters );
字符串切割函数

  • delimiters参数是一个字符串,定义了用作分割符的字符集合。
  • 第一个参数指定一个字符串,它包括了0个或者多个由delimiters字符串中一个或者多个分割符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改)
  • strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存他在字符串中的位置。
  • strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 如果字符串中不存在更多的标记,则返回NULL指针。

🌺strtok函数使用

strtok函数和其他字符串函数相比较来说非常特殊,具体的我们用一段代码来分析,如下代码。

#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "www.baidu@qq123456789";
	char arr2[50] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".@";
	char* ret = NULL;
	ret = strtok(arr2, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);
	ret = strtok(NULL, p);
	printf("%s\n", ret);

	return 0;
}

我们arr数组就是一段字符串数组,我们的p则是指向一段分割符的集合。strtok函数对字符串进行切割就是利用分割符对字符串进行切分,并将分割符修改为\0,然后返回标记的地址。所以我们说在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可以修改。我们来观察运行的结果,如下图。
在这里插入图片描述
我们之所以说strtok这个函数特殊,就是因为如果我们要对一段字符串进行切分的话,我们只需要在第一次调用的时候把字符串传给它,在后面的调用就只需要传NULL给它就行了,该函数具有记忆功能,会在后来的调用自动在上一次的调用的后面继续向后进行,在遇到分割符时,会将分割符再次修改为\0,然后返回这一段的标记地址。我们还可以通过监视窗口观察strtok函数将分割符修改的情况以及返回标记地址的情况,如下图。
在这里插入图片描述
我们可以观察到分割符.@被修改为\0,并且依次返回每一段标记的的首地址。在理解了strtok函数的机制之后,我们可以把代码写的更加简介一点,如下代码。

#include <stdio.h>
#include <string.h>

int main()
{
	char arr[] = "www.baidu@qq123456789";
	char arr2[50] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".@";
	char* ret = NULL;
	for (ret = strtok(arr2, p); ret != NULL;ret = strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

▶️strtok函数模拟实现

#include <stdio.h>
#include <string.h>

char* my_strtok(char* arr, const char* p)
{
	static char* val = NULL;
	if (arr != NULL)
	{
		val = arr;
	}
	else
	{
		val++;
		arr = val;
	}
	if (*val == '\0')
	{
		return NULL;
	}
	else
	{
		while (*val != '\0')
		{
			for (int i = 0; *(p + i) != '\0'; i++)
			{
				if (*val == *(p + i))
				{
					*val = '\0';
					return arr;
				}
			}
			val++;
		}
		return arr;
	}
}

int main()
{
	char arr[] = "www.baidu@qq123456789";
	char arr2[50] = { 0 };
	strcpy(arr2, arr);
	const char* p = ".@";
	char* ret = NULL;
	for (ret = my_strtok(arr2, p); ret != NULL; ret = my_strtok(NULL, p))
	{
		printf("%s\n", ret);
	}
	return 0;
}

🌈strerror函数

char * strerror ( int errnum );
错误打印函数

  • erenum是错误码,在传给strerror函数一个错误码后,函数会返回一个地址,根据地址可以打印错误信息。
  • 错误码是C语言库函数里自带的报错时候的错误码。

⛵️strerror函数使用

strerror函数可以利用错误码转换成错误信息,具体转换我们用代码进行观察,如下代码。

#include <stdio.h>
#include <string.h>

int main()
{
	printf("%s\n", strerror(0));
	printf("%s\n", strerror(1));
	printf("%s\n", strerror(2));
	printf("%s\n", strerror(3));
	printf("%s\n", strerror(4));
	printf("%s\n", strerror(5));

	return 0;
}

错误信息打印如下图。
在这里插入图片描述
我们可以看到,每个错误码都对应着不同的错误信息,我们在程序的设计中,合理的运用strerror函数可以帮助我们更快的找到错误的出处。

✈️总结

本章介绍了两个字符串函数strtok函数和strerror函数,strtok函数的使用需要注意它的一些特别之处,strerror函数是根据错误码打印错误信息,可以帮助我们快速的找出程序的错误,我们在这就不对strerror函数进行模拟实现。字符串函数的介绍在这里也就告一段落了,希望大家多多支持,如有错误之处还望指正。
在这里插入图片描述

相关文章:

  • 【Docker】Docker-Compose基础使用说明
  • 用python抠图
  • Java Object类下getClass()方法具有什么功能呢?
  • MongoDB安装使用教程
  • 封装js一些常用的方法(默认值、数组、判空、数值等等)
  • OpenCV之图片预处理方法
  • 跟我学Python图像处理丨傅里叶变换之高通滤波和低通滤波
  • 分布式监控系统——Zabbix(2)部署
  • 机械学习房价预测实战(mse 回归 交叉验证)
  • 未来5年,这个职业最有可能被BI软件替代,网友:现在跑还来得及
  • 【热力学】基于Matlab模拟生成热晕
  • 『Halcon与C#混合编程』第二章02_迈德威视工业相机SDK图像变量转换
  • NASA成功撞击1100公里外小行星!人类史上首次,主动避免恐龙覆辙,马斯克亦有贡献...
  • PHP Iterable 可迭代对象
  • 5. Hadoop集群操作
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【EOS】Cleos基础
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • docker python 配置
  • JavaScript服务器推送技术之 WebSocket
  • java第三方包学习之lombok
  • js继承的实现方法
  • uva 10370 Above Average
  • ViewService——一种保证客户端与服务端同步的方法
  • Yii源码解读-服务定位器(Service Locator)
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 从输入URL到页面加载发生了什么
  • 新版博客前端前瞻
  • 再次简单明了总结flex布局,一看就懂...
  • 2017年360最后一道编程题
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (Java)【深基9.例1】选举学生会
  • (搬运以学习)flask 上下文的实现
  • (补)B+树一些思想
  • (十三)Flask之特殊装饰器详解
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • ***通过什么方式***网吧
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • ?
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [BZOJ2208][Jsoi2010]连通数
  • [C]整形提升(转载)
  • [github配置] 远程访问仓库以及问题解决
  • [go 反射] 进阶
  • [JavaWeb学习] Spring Ioc和DI概念思想
  • [js]- 两个对象的合并(Object.assign)
  • [js] 正则表达式
  • [LeetCode]--61. Rotate List
  • [LeetCode]—Anagrams 回文构词法
  • [PHP]pearProject协作系统 v2.8.14 前后端
  • [poj] 3422 Kaka's Matrix Travels || 最小费用最大流
  • [Python学习笔记][Python内置函数]