C:字符串函数(完)-学习笔记

news/2024/9/20 6:26:37 标签: c语言, 学习, 笔记

目录

前言:

1、strstr

1.1 strstr的使用

4.2 strstr的模拟实现

5、strtok

5.1 strtok函数的介绍

 5.2 strtok函数的使用

6、strerror


前言:

这篇文章将介绍strstr函数,strtok函数,strerror函数

1、strstr

1.1 strstr的使用

strstr  --- string string

在一个字符串中,找一个字字符串,找第一次出现的位置

 

我们来尝试使用strstr函数:

    char arr1[ ] = "abcdefabcdef ";
	char arr2[ ] = "def";
    char* ret = strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("找到了,%s\n", ret);

这就是strstr函数的作用,通常用来找一个字符串。

4.2 strstr的模拟实现

我们来尝试一下模拟strstr函数(这里小编学的有点模糊,因此可能会有些问题,还望理解,如果后面有时间会来修改)

第一次匹配成功

上面是比较简单的场景,匹配一次便成功了,那如果需要多次匹配呢?

 

#include <stdio.h>
#include <string.h>
#include <assert.h>
const char* my_strstr(const char* str1, const char* str2)//只寻找,不希望改变,所以使用const修饰
{
	assert(str1 && str2);
	const char* s1 = str1;
	const char* s2 = str2;
	const char* cur = str1;//cur指针记可能的开始匹配的位置
	if (*str2 == '\0')//当str2是空字符串时,直接返回str1
		return str1;
	while (*cur)
	{
		//完成一次匹配
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
			return cur;
		cur++;
	}
	return NULL;
}
int main()
{
	char arr1[ ] = "abcdefabcdef ";
	char arr2[ ] = "def";
    char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
		printf("找不到\n");
	else
		printf("找到了,%s\n", ret);
	return 0;
}

5、strtok

5.1 strtok函数的介绍

strtok的作用就是通过分隔符切割字符串

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

先来说明一下strtok的使用场景:

char arr1[ ] = " zhangsan@year.ch"

char arr2[ ] ="www.hawei.com"

char arr3[ ] = " 123.234.345"

我们来一句一句解释上面的介绍

sep参数指向一个字符串,定义了用作分隔符的字符集合

char arr1[ ] = " zhangsan@year.ch"

上面的字符串中的分隔符是哪些呢?

‘@’、‘.‘

我们将这些分隔符放在一起就叫做分隔符的集合

sep中方的就是"@ ."

如果你要切割字符串char arr1[ ] = " zhangsan@year.ch"

你可以写一个数组char str[ ] = "@ ."

 第一个参数指定一个字符串,它包含了0个或者多个有sep字符串中一个或者多个分隔符分隔的标记

char arr1[ ] = " zhangsan@year.ch"

这里面的标记有zhangsan,year,ch。

 strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针。(注:strtok函数会改变被操作的字符串,所以被strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。

char arr1[ ] = " zhangsan@year.ch"

str开始会先找到zhangsan这个标记,并且把这个标记的结尾改为\0,也就是说会把@改为\0

zhangsan@year.ch

zhangsan\0year.ch

同时会返回指向这个标记的指针

由于strtok会改变被操作的字符串,所以为了防止字符串被修改,一般都会临时拷贝原字符串

从上图中我们可以看到arr1中的@被改为了\0,这样arr1就会被破坏。因此为了防止破坏原数组,我们可以这样使用

int main()
{
	char arr1[] = "zhangsan@year.ch";
	char sep[] = "@.";
	char buf[30] = { 0 };
	strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中
	char * p = strtok(buf, sep);
	return 0;
}

这样我们可以随意修改buf中的元素而不会对原数组照成影响。

strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。

strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,直接下一个标记。

char arr1[ ] = " zhangsan@year.ch"

int main()
{
	char arr1[] = "zhangsan@year.ch";
	char sep[] = "@.";
	char buf[30] = { 0 };
	strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中
	char * p = strtok(buf, sep);
	return 0;
}

1. 第一个参数不为 NULL 时

  • strtok函数的第一个参数不为NULL时,它接收一个字符串作为起始处理的对象(假设这个字符串为str)。
  • 函数会根据指定的分隔符(通常在后续调用中指定)在str中查找第一个分隔符。
  • 找到第一个分隔符后,它会将分隔符替换为'\0',这样就把原始字符串str分割成了两部分,函数返回的是分隔符之前的子字符串(第一个标记)。
  • 同时,strtok函数会在内部保存当前处理的位置,这个位置是指刚刚找到的分隔符之后的字符位置,以便后续继续处理字符串的剩余部分

2. 第一个参数为 NULL 时

  • strtok函数的第一个参数为NULL时,它不会再接收新的字符串,而是基于上一次调用strtok时保存的位置继续处理同一个字符串。
  • 它会从上次保存的位置开始,查找下一个分隔符,同样将分隔符替换为'\0',然后返回新的子字符串(下一个标记)。
  • 这个过程可以重复,直到字符串中没有更多的分隔符为止。

 5.2 strtok函数的使用

int main()
{
	char arr1[] = "zhangsan@year.ch";
	char sep[] = "@.";
	char buf[30] = { 0 };
	strcpy(buf, arr1);//临时拷贝arr1中字符串到buf中
	char* p = NULL;
	for (p = strtok(buf, sep); p != NULL; p = strtok(NULL, sep))
	{
		printf("%s\n", p);
	}
	return 0;
}

6、strerror

char * strerror (int errnum);

strerror 函数可以把参数部分错误码对应的错误信息的字符串地址返回来。 在不同的系统和C语言标准库的实现中都规定了一些错误码,一般是放在 errno.h 这个头文件中说明的,C语言程序启动的时候就会使用一个全局的变量errno来记录程序的当前错误码,只不过程序启动的时候errno是0,表示没有错误,当我们在使用标准库中的函数的时候发生了某种错误,就会将对应的错误码,存放在errno中,而一个错误码的数字是整数很难理解是什么意思,所以每一个错误码都是 有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。

errno变量用来记录该程序中的错误代码信息

int main()
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d:%s\n",i, strerror(i));
	}
	return 0;
}

这里每一个数字对应的都是一个错误码。这里只是为了展示一下错误信息,并不是函数strerror的用法。

关于用法小编目前还没有学到,等到后面再来补充。


结语:本篇文章到这里就结束了,希望能够对大家有所帮助。


http://www.niftyadmin.cn/n/5666762.html

相关文章

POI操作EXCEL增加下拉框

文章目录 POI操作EXCEL增加下拉框 POI操作EXCEL增加下拉框 有时候通过excel将数据批量导入到系统&#xff0c;而业务操作人员对于一些列不想手动输入&#xff0c;而是采用下拉框的方式来进行选择 采用隐藏sheet页的方式来进行操作 String sheetName "supplier_hidden_s…

【Nginx】Nginx 使用 SSL 的详细指南

目录 1. 引言2. 准备工作2.1 安装 Nginx在 Ubuntu 上安装 Nginx在 CentOS 上安装 Nginx 2.2 获取 SSL 证书使用 Let’s Encrypt 获取证书 3. 配置 Nginx 启用 SSL3.1 编辑 Nginx 配置文件3.2 添加 SSL 配置 4. 强化 SSL 配置4.1 选择安全的加密套件4.2 启用 HSTS 5. 测试 SSL 配…

WEB攻防-JavaWweb项目JWT身份攻击组件安全访问控制

知识点&#xff1a; 1、JavaWeb常见安全及代码逻辑&#xff1b; 2、目录遍历&身份验证&逻辑&JWT&#xff1b; 3、访问控制&安全组件&越权&三方组件&#xff1b; 演示案例&#xff1a; JavaWeb-WebGoat8靶场搭建使用 安全问题-目录遍历&身份认…

【图像压缩与重构】基于BP神经网络

课题名称&#xff1a;基于BP神经网络的图像压缩与重构&#xff08;带GUI) 相关资料&#xff1a; 1. 代码注释 2.BP神经网络原理文档资料 3.图像压缩原理文档资料 程序实例截图&#xff1a;

【machine learning-七-线性回归之成本函数】

监督学习之cost function 成本函数权重、偏置如何实现拟合数据成本函数是如何寻找出来w和b&#xff0c;使成本函数值最小化&#xff1f; 在线性回归中&#xff0c;我们说到评估模型训练中好坏的一个方法&#xff0c;是用成本函数来衡量&#xff0c;下面来详细介绍一下 成本函数…

Linux通过yum安装Docker

目录 一、安装环境 1.1. 旧的docker包卸载 1.2. 安装常规环境包 1.3. 设置存储库 二、安装Docker社区版 三、解决拉取镜像失败 3.1. 创建文件目录/etc/docker 3.2. 写入镜像配置 https://docs.docker.com/engine/install/centos/ 检测操作系统版本&#xff0c;我操作的…

【论文阅读笔记】YOLOv10: Real-Time End-to-End Object Detection

论文地址&#xff1a;https://arxiv.org/abs/2405.14458 文章目录 论文小结论文简介论文方法为NMS-free训练的一致性双标签分配双标签分配一致性匹配度量 效率-精度整体驱动的模型设计效率驱动模型设计轻量级分类检测头Spatial-channel 解耦下采样Rank-guided block design 精度…

基于vue框架的宠物销售管理系统3m9h3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,宠物分类,宠物信息 开题报告内容 基于Vue框架的宠物销售管理系统开题报告 一、引言 随着人们生活水平的提高和情感需求的日益增长&#xff0c;宠物已成为许多家庭不可或缺的一员。宠物市场的繁荣带动了宠物产业链的快速发展&…