C字符函数及字符串函数

但行前路,莫问归期

在这里插入图片描述

要注意的是,要使用下边所讲的函数要包含头文件<string.h>

strlen

求字符串的长度
在这里插入图片描述

  • 函数参数:字符串指针
  • 函数功能:传入字符串指针,字符串是以\0为结束标志,返回的类型size_t其实就是unsigned int,函数返回的是字符串中**‘\0’前边字符的个数**,传入字符串指针用const修饰*str,防止函数意外修改传入的字符串。
  • 返回值类型:无符号整形,即结束标志前字符数量

函数功能演示
在这里插入图片描述
查找到’\0’就结束演示
在这里插入图片描述
模拟实现
根据函数的功能,返回值来编写
扩展一笔

unsigned int _strlen(const char *arr)
{
	int count = 0;//计数
	while (*arr)
	{
		count++;
		arr++;//字符指针向后走
	}
}

strcpy

在这里插入图片描述

  • 函数参数:一个是目的地,另一个是源头。
  • 函数功能:将源头字符串拷贝到目标空间。
  • 返回值:返回拷贝完成后第一个字符串的地址。

注意:
1,源字符串必须以’\0’结尾。不能这样搞

char arr[4]={'a','b','c','d'}

 如果第二个参数是这样一个没有结束标志’\0’的字符串,那么函数在实现时就会一直往后找,就会越界访问产生错误。
2,函数会将源字符串的结束标志’\0’也会拷贝过去。
可以调试观察
在这里插入图片描述
 在打印时,遇到’\0’就结束,不要误以为该函数清空了原来的内容。
模拟实现(记得包含头文件assert.h)

char* _strcpy(char* dest, const char* src)
{
	char* ret = dest;//保存dest的首地址
	assert(dest != NULL);
	assert(src != NULL);
	while (*src!='\0')//\0之前全部OK
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//\0也搞过来
	return ret;
}
strncpy

和strcpy不同的是,多了一个参数。
在这里插入图片描述

 拷贝num个字节过去,如果源字符串已经没有元素了,就将dst后边的字节变成零。
函数功能展示:
在这里插入图片描述


strcat

  • 参数:这个函数的参数和strcpy一模一样。
  • 功能:strcpy在目标字符串的开头拷贝源字符串,但strcat是在目标字符串的末尾,即结束标志’\0’位置开始将源字符串拷贝到目标字符串。
  • 返回值:和strcpy一样,返回目标字符串的指针。

功能呈现:
在这里插入图片描述
函数模拟实现:

char* _strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest != NULL);
	assert(src != NULL);
	while (*dest)
	{
		dest++;
	}//找到目标字符串的末尾
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
strncat

和前边strcpy和strncpy的区别一样。
在这里插入图片描述
函数功能演示:
在这里插入图片描述


strcmp

字符串比较函数
在这里插入图片描述

  • 参数:两个,他们两个之间的比较
  • 功能:以两个字符串的每个字符以ASCII码值逐个比较
  • 第一个字符串如果大于第二个字符串,就返回大于零的数字。
  • 第一个字符串等于第二个字符串,就返回0。
  • 第一个字符串小于第二个字符串,就返回小于零的数字。
  • 返回值:上边已经说明。

函数功能呈现
f的ASCII在‘\0’之前。大于返回1(大于0的数)
在这里插入图片描述
如果等于返回零。
在这里插入图片描述
小于返回-1(小于0的数)
在这里插入图片描述
函数模拟实现

int _strcmp(const char* src, const char* dest)
{
	int ret = 0;
	assert(src != NULL);
	assert(dest != NULL);
	while (!(ret = *(unsigned char*)src - *(unsigned char*)dest) && *dest)
	{
		++src;
		++dest;
	}
	if (ret < 0)
	{
		return -1;
	}
	else if (ret > 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}
strncmp

不再是从头比较到尾,而是比较num个字符。
函数功能演示:
在这里插入图片描述


strstr

在这里插入图片描述

  • 参数:传入两个字符指针。
  • 功能:在str1中找到str2第一次出现的位置。
  • 返回值:返回找到该位置的指针。如果没有找到,就返回NULL。

函数功能呈现
在这里插入图片描述
函数模拟实现

char* _strstr(const char* str1, const char* str2)
{
	char* cp = str1;
	char* s1, * s2;
	if (!*str2)
	{
		return str1;//如果str2为空,返回str1
	}
	while (*cp)
	{
		s1 = cp;
		s2 = str2;//传入参数不可以修改
		while (*s1 && *s2 && !(*s1 - *s2))
		{
			s1++;
			s2++;
		}
		if (!*s2)//如果跳出循环且s2已经是'\0’了。
		{
			return cp;
		}
		cp++;
	}
	return NULL;
}

strtok

在这里插入图片描述

  • 参数:第一个参数为目标字符串,第二个参数为分隔符集合
  • 函数功能:第一个参数即目标字符串是包含0个或者多个由分隔符分割而成的字符串。
    strtok会找到str中的一个标记,并将这个标记更改为\0,返回一个指向这个标记的指针(strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符创一般都是临时拷贝的内容且允许修改)。
     strtok函数的第一个参数不为NULL,函数将找到str中的第一个标记,strtok函数将保存他在字符串中的位置。
     如果函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
  • 返回值:如果目标字符串中不存在标记的分割字符,就返回NULL指针,如果找到,将该标记设置为结束标志\0。

函数功能展示
在这里插入图片描述
调试动图展示,会让你更加清晰了解函数的功能
在这里插入图片描述
上边是作者滴QQ,欢迎大家一起学习交流,嘿嘿。


strerror

在这里插入图片描述
要使用这个函数,需要包含头文件<errno.h>

  • 函数参数:errnum–错误号,通常是errno
  • 函数功能:返回一个指向错误字符串的指针,该错误字符串描述了错误errnum。
  • 函数解释:这个函数会从内部搜索错误号,返回一个指向该错误信息字符串的指针,即错误消息字符在头文件中,程序运行时若有错误,strerror会捕获错误类型并返回一个指针,这个指针指向错误消息字符。

函数功能演示:
在这里插入图片描述
 由于当前文件内并没有heihei这个文件,以只读的方式打开搜索该文件是找不到的,所以返回的错误信息就是没有相关文件或者相关文件已经被销毁。
这里文件相关操作有遗忘的小伙伴可以移步文件超消息讲解来回顾回顾。


字符串大小写转换

strupr
  • 语法格式如下:
    strupr(字符串);(要注意,新的编译器规定使用该函数式要加上_)
  • 函数功能:将字符串中的小写字符转换成大写字母,其他字母不变。

函数功能实现:
在这里插入图片描述

strlwr

格式相同,功能相反
演示如下:
在这里插入图片描述


memcpy

在这里插入图片描述

  • 函数参数:目标字符串,源字符串,数量(unsigned int),void类型可以适配多种类型。
  • 函数功能:函数功能和strncpy很相似,只是memcpy可以操作的类型更加丰富,从源字符串首元素位置开始,向后拷贝num个字节的数据到目标字符串的位置,这个函数遇到’\0’不会停下来,且如果源字符串和目标字符串有重叠时,拷贝结果是未定义的。

例如,需要拷贝四个字节字符。而源字符串在目标字符串前3个子节的位置。
在这里插入图片描述
 本意是将1,2,3,4全部拷贝过去,然而在第一次拷贝时,元素1已经把元素4覆盖。
这与背后函数的实现有关,没有做重叠时的处理。
函数模拟实现如下:

void* _memcpy(void* dst, const void* src, size_t count)
{
	void* ret = dst;//记录目标数组的地址
	assert(dst);
	assert(src);
	while (count--)
	{
		*(char*)dst = *(char*)src;
		dst = (char*)dst + 1;
		src = (char*)src + 1;
	}
	return ret;
}

memmove

 函数memcpy存在重叠问题的话,memmove就是用来解决这个问题的,如果源空间和目标空间存在重叠的话,就得使用memmove函数处理。
函数格式和作用和momcpy一模一样。
函数功能呈现:
在这里插入图片描述
模拟实现:

void* _memmove(void* dst, const void* src, size_t count)
{
	void* ret = dst;
	if (dst <= src || (char*)dst >= ((char*)src + count))
	{
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst + 1;
			src = (char*)src + 1;
		}
	}
	else//从后往前拷贝
	{
		dst = (char*)dst + count - 1;
		src = (char*)src + count - 1;
		while (count--)
		{
			*(char*)dst = *(char*)src;
			dst = (char*)dst - 1;
			src = (char*)src - 1;
		}
	}
}

memcmp

在这里插入图片描述

  • 两个数组(可以是字符数组,也可以是其他类型)相比,num个字节,void*可以适配多种类型。
  • 函数功能和strcmp一样,可以适配的类型更多了而已。

函数功能呈现:
在这里插入图片描述
整型四个字节,两个数组前两个元素相等,故返回值0。
在这里插入图片描述
更改为12个字节,返回值就变为-1了。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/132102.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++初阶】二、入门知识讲解(引用、内联函数、auto关键字、基于范围的for循环、指针空值nullptr)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】一、入门知识讲解 &#xff08;C关键字、命名空间、C输入&输出、缺省参数、函数重载&#xff09;-CSDN博客 六 . 引用 &#xff08;1&#xff09;. 引用的概念和特性…

同城跑腿服务预约小程序的作用如何

无论是互联网服务化加快还是前几年疫情冲击&#xff0c;在同城生活服务场景中出现了很多商机&#xff0c;如外卖跑腿、校园跑腿、代买代送等&#xff0c;无论公司还是个人都借势不断提升自己品牌的影响力&#xff0c;并且依赖朋友圈不断提升生意营收。 同城跑腿品牌不少&#…

C++使用线程池模拟异步事件处理机制

在C很多框架中都有异步事件处理机制&#xff0c;这导致我们在看源码时经常很疑惑&#xff0c;难以理解&#xff0c;而其中包含的编程套路可能是一些成熟的技术&#xff0c;只是我们不熟悉&#xff0c;比如WebRTC中类似于Qt的信号槽机制&#xff0c;线程事件处理, 或者使用系统异…

CS224W5.2——Relational and Iterative Classification

本节中&#xff0c;我们介绍用于节点分类的关系分类器和迭代分类。 从关系分类器开始&#xff0c;我们展示了如何基于邻居的标签迭代更新节点标签的概率。然后讨论迭代分类&#xff0c;通过根据邻居的标签及其特征预测节点标签来改进集体分类。 文章目录 1. 框架2. 关系分类3.…

软件测试之Web自动化测试,Web自动化测试的详细流程和步骤

一、什么是web自动化测试 自动化&#xff08;Automation&#xff09;是指机器设备、系统或过程&#xff08;生产、管理过程&#xff09;在没有人或较少人的直接参与下&#xff0c;按照人的要求&#xff0c;经过自动检测、信息处理、分析判断、操纵控制&#xff0c;实现预期的目…

JUC下常见类

JUC(java.util.concurrent) 的常见类ReentrantLock原子类线程池信号量SemaphoreCountDownLatch JUC(java.util.concurrent) 的常见类 ReentrantLock ReentrantLock可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全。 用法: lock(): 加锁, 如果获…

【开源】基于Vue.js的大学兼职教师管理系统的设计和实现

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管理3.3 课程管理模块3.4 授课管理模块3.5 课程考勤模块3.6 课程评价模块3.7 课程成绩模块3.8 可视化图表 四、免责说明 一、摘要 1.1 项目介绍 大学兼职教师管理系统&#xff0…

Arduino、arm、树莓派、单片机四者有什么不同

文章目录 ArduinoARM树莓派单片机 初学单片机的同学&#xff0c;可能会对Arduino、ARM、树莓派以及单片机这些概念比较模糊&#xff0c;实际上&#xff0c;这四个是不同的概念和技术。 Arduino Arduino&#xff08;阿尔杜伊诺&#xff09;是一种开源电子原型平台&#xff0c;它…

基于SSM的房屋租售信息管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

人工智能基础_机器学习022_使用正则化_曼哈顿距离_欧氏距离_提高模型鲁棒性_过拟合_欠拟合_正则化提高模型泛化能力---人工智能工作笔记0062

然后我们再来看一下,过拟合和欠拟合,现在,实际上欠拟合,出现的情况已经不多了,欠拟合是 在训练集和测试集的准确率不高,学习不到位的情况. 然后现在一般碰到的是过拟合,可以看到第二个就是,完全就把红点蓝点分开了,这种情况是不好的, 因为分开是对训练数据进行分开的,如果来…

Vatee万腾科技决策力的未来展望:开创数字化创新的新高度

随着科技不断演进&#xff0c;Vatee万腾的科技决策力在数字化创新领域展现出了强大的潜力和前瞻性。 Vatee万腾的科技决策力被视为数字化创新的引擎&#xff0c;为未来创新注入了新的动力。通过深刻的市场洞察和科学决策&#xff0c;Vatee万腾致力于推动数字化创新走向新的高度…

mycat2 读写分离

mycat2 读写分离 mycat2 读写分离1.创建两个主从复制的数据库2.mycat2 读写分离3.mycat2读写分离测试 mycat2 读写分离 1.创建两个主从复制的数据库 参考&#xff1a;mysql主从复制 2.mycat2 读写分离 连接到mycat数据库 1.在mycat中创建数据库mydb1 CREATE DATABASE mydb…

linux发展史(必看系列)

Linux介绍&#xff1a; Linux&#xff0c;Linux Is Not UniX 的首字母缩写。是一款开源的&#xff0c;能自由传播的类Unix的操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff08;Linus Benedict Torvalds&#xff09;于1991年10月5日首次发布&#xff0c;它主要受到…

iOS 17.2更新:15Pro支持拍摄空间视频!

苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新&#xff0c;已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右&#xff0c;内部版本号为&#xff08;21C5040g&#xff09;&#…

山西电力市场日前价格预测【2023-11-12】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-12&#xff09;山西电力市场全天平均日前电价为224.59元/MWh。其中&#xff0c;最高日前电价为434.30元/MWh&#xff0c;预计出现在18:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

前端开发入门笔记(八)CSS3属性详解:动画详解+Flex布局图文详解+Web字体

参考链接&#xff1a;https://web.qianguyihao.com/02-CSS%E5%9F%BA%E7%A1%80/12-CSS3%E5%B1%9E%E6%80%A7%E8%AF%A6%E8%A7%A3%EF%BC%9A%E5%8A%A8%E7%94%BB%E8%AF%A6%E8%A7%A3.html#_3%E3%80%81%E6%97%8B%E8%BD%AC%EF%BC%9Arotate 过渡 transition的中文含义是过渡。过渡是CSS…

【Linux网络】系统调优之聚合链路bonding,可以实现高可用和负载均衡

一、什么是多网卡绑定 二、聚合链路的工作模式 三、实操创建bonding设备&#xff08;mode1&#xff09; 1、实验 2、配置文件解读 3、查看bonding状态,验证bonding的高可用效果 三、nmcli实现bonding 一、什么是多网卡绑定 将多块网卡绑定同一IP地址对外提供服务&#xf…

《红蓝攻防对抗实战》九.内网穿透之利用GRE协议进行隧道穿透

​ 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解 《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网 《红蓝攻防对抗实战》三.内网探测协议出网之HTTP/HTTPS协议探测出网 《红蓝攻防对抗实战》四.内网探测协议出网之ICMP协议探测出网 《红蓝…

深度学习 python opencv 火焰检测识别 计算机竞赛

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

Sensor 点亮出图后,颜色偏红或者偏绿是为什么?

这是因为 sensor balck level 的值配置的不正确导致&#xff0c;black level 的值一般在效果参数的 calibration 参数里面。 在驱动调试阶段&#xff0c;我们一般都是复用其他已调试好的&#xff0c;sensor 的驱动文件及效果文件&#xff0c; 而不同 sensor 的 balck level 的…