c语言字符串函数详解(全)

 字符串函数

1.strlen函数  求字符串长度的

3b35eb199cd0430fb3e8e7e5fc335220.png

a993220bfbba4ccfaaeb3d7b8312ccd7.png

11c1f0c3b33b45d39bb41a15534d03c1.png

836c4988d90e4dd8bedf539b4c23d1c9.png

bb63e47ff54443b8a33483bf292cc1e5.png

b62d5280c5344ea695f8212cf04e5e66.png



//求字符串长度
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		count++;
		*str++;
		
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	int red = my_strlen(arr);
	printf("%d\n", red);
	return 0;
}

2.  strcpy  字符串拷贝

78838a2286914b4e942f6eaa8c7ffbfb.png

992326c6adff41d6aea4c3e0640f734c.png7b3590430b6a424a8e263478e3144d0a.png

fadcde6fe1934434946c043eb97f5c27.png

846e16bff81045c7aae0bd5b2af8db6a.png

//求字符串拷贝
char* my_strcpy(char* arr2, char* arr1)
{
	char *red = arr2;
	while (*arr2++ = *arr1++)//'\0'赋给arr2时arr2为假就停止循环
	{
		;
	}
	return red;

}
int main()
{

	char arr1[] = { "abc" };
	char arr2[40] = { 0 };
	 my_strcpy(arr2, arr1);
	printf("%s", arr2);
	return 0;
}

3、strcat  字符串连接

56f2507cb157429b8318b711907fae7e.png

9b6bce9f8621485d9b7068f6eb7a4406.png

3e7cfbfd28a84bcfb69d8e47ca486cf7.png

d8aed949c9d643f9a53a90ae1d6ec1d0.png

先找到需要连接的字符串末端'\0'处,然后拷贝

a20eae6b904046df82ddb744638a3ebb.png

拷贝是在\0这里进行拷贝。

//字符串连接
char* my_strcat(char* arr1, char* arr2)
{
	char* ret=arr1;
	while (*arr1 != '\0')
	{
		arr1++;
	}
	while (*arr1++ = *arr2++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[40] = { "hello" };
	char arr2[] = "bit";
	my_strcat(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

4.strcmp-字符串比较函数。

3fef40e824594c87b6a73573d208211a.png

因为这个是二个不同的数组名,他们比较的肯定不一样,因为首元素地址不同,所以比较就不相同,这里比较的不是内容,是地址。

e5fd2abddb2141e7b809b53ed3dbec39.png

比较二个字符串应该用strcmp函数

f619af0b07374aebb816feac424e4e84.png

61cf29edf6754afcb11e6fcba6e7ed27.png

//求字符串比较函数
int my_strcmp(char* arr1, char* arr2)
{
	while (*arr1 == *arr2)
	{
		if (*arr1 == '\0')
		{
			return 0;//相等
			arr1++;
			arr2++;
		}
		return (*arr1 - *arr2);
		
	}
}
int main()
{
	char arr1[] = "abc";
	char arr2[]="bcd";
	int ret = my_strcmp(arr1, arr2);
	if (ret > 0)
	{
		printf(">0\n");
	}
	else if (ret<0)
	{
		printf("<0\n");

	}
	else
	{
		printf("==0\n");

	}
	return 0;
}

eead6e8f7cb7448e98ffa242afa5874b.png

这个代码关键就是*arr1和*arr2相同的情况下遇到'\0时应该终止循环,返回相等。

232f2bd27ba74a6f9de66e2bceec748d.png

1.strncpy  -字符串拷贝。

70d1cb5b5bf548bdae99d135dfbe0d63.png

2.strncat(字符串连接)

e017ba5774d94e48b51aff8597a1f176.png

加了n就是加了限定的条件,比如strncmp

3.strstr -----查找子串

41b2d5f94cc14ca6aae50816b105bdc2.png

如果找到了子串就返回第一个字符的地址,也就是b字符的地址,因为是从b字符开始才算找到子串。找不到返回空指针,NULL

//模拟实现一下strstr
char* my_strstr(char* arr1, char* arr2)
{
	char* s1 = arr1;
	char* s2 = arr2;
	char* p = arr1;
	while (*p)
	{
		s1 = p;
		s2 = arr2;
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 =='\0')
		{
			return p;
        }
		p++;
	}
	return NULL;
}
int main()
{
	char arr1[] = "www.h";
	char arr2[] = "w.h";
	char* ret = my_strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("子串不存在\n");
	}
	else
	{
	 printf("%s\n", ret);
	}
	return 0;
}

95ed4b4084524f92905c93d182223639.png

673f65abf03f48babe13a03b7176eebd.png


strtok函数

427bd67eb84b42ffbe84b538c24732f9.png
bb75a672aae7437c8ac37c241c0694ae.png

c66490507e684190bc5745b4bbc46682.png

//strcok()函数
#include <string.h>
int main()
{
	char arr1[] = "zhangsan@1666.com";
	char arr2[30] = { 0 };
	strcpy(arr2, arr1); 
	const char* p = "@.";
	char* s2 = NULL;

	// 初始化只是初始话一次
	for (s2= strtok(arr2, p); s2 != NULL; s2=strtok(NULL, p))
	{
		printf("%s\n", s2);
			
	}
	return 0;
}


3. strerror?函数的使⽤?

6a02b68072014643a83379769f7ee5b6.png

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

68625cc7fdd544cb90bf83b4b9c7ea78.png


#include <errno.h>
int main()
{
	for (int i = 0; i < 10; i++)
	{
		printf("%s\n", strerror(i));
	}
	return 0;
}

19808a9d82e242169f05ae92896d359b.png

96ef13a63dc6424a93a5343320385c65.png

4.memcpy  -内存拷贝

851d3c7f23ba44ddbe3a74216e71083b.png

4a8c58afac3f49c490ccf88f27e6e512.png

81e67cee758545f7b500564a0fc2c3d1.png


模拟实现memcpy函数
void* my_memcpy(void* dest, void* src,size_t num)
{
	char* ret = dest;
	while (num--)
	{
		*(char*)dest = *(char*)src;
		dest = (char*)dest + 1;
		src = (char*)src + 1;
	}
	return ret;

}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	my_memcpy(arr1 + 2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
 }
	return 0;
}
//不能解决重叠问题
重叠问题

6f7550548a08479688237b95f5efec43.png

3ee32f320cde4731967af3d4aab33722.png

memmove使⽤和模拟实现

3947e8552f0c4f6d86d4a22cd8f726f9.png

int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memmove(arr1 + 2, arr1, 20);
	for (int i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
 }
	return 0;
}
//不能解决重叠问题

2ab73a7200d84ac9be06e4edecfe743a.png

memset函数的使⽤

f056fe03e4854b07b32afd3431751ace.png

090ecb45d37548b2b29ca44a67c830bc.png

//memset内存设置
int main()
{
	char arr[] = "hello bite";
	memset(arr, 'x', 5);//以字节为单位来设置的
	printf("%s\n", arr);
	return 0;
}

 memcmp函数的使⽤

37593ba8b8924f69974f5e6c3ddb480d.png



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

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

相关文章

【MySQL】(基础篇十二) —— 子查询

分组数据 本文介绍什么是子查询以及如何使用它们。 SQL允许我们创建子查询&#xff08;subquery&#xff09;&#xff0c;即嵌套在其他查询中的查询。这样可以实现更复杂的查询&#xff0c;理解这个概念的最好方法是考察几个例子。 利用子查询进行过滤 需求&#xff1a;查询…

一行超长日志引发的 “血案” - Containerd 频繁 OOM 背后的真相

案发现场&#xff1a;混沌初现 2024年6月10日&#xff0c;本应是平静的一天。但从上午 9 点开始&#xff0c;Sealos 公有云的运维监控告警就开始不停地响。北京可用区服务器节点突然出现大量 “not ready” 告警&#xff0c;紧接着&#xff0c;系统自动触发 004 节点重启&…

重学java 75.JDK新特性 ① Lambda表达式

你所做的事情&#xff0c;也许暂时看不到成果&#xff0c;你不是没有成长&#xff0c;而是在扎根 —— 24.6.19 一、函数式编程思想和Lambda表达式定义格式 1.面向对象思想:是Java的核心编程思想 强调的是找对象,帮我们做事儿 比如:去北京 -> 强调的是怎么去,火车,高铁,飞机…

为什么人们对即将推出的 Go 1.23 迭代器感到愤怒

原文&#xff1a;gingerBill - 2024.06.17 TL;DR 它让 Go 变得太“函数式”&#xff0c;而不再是不折不扣的命令式语言。 最近&#xff0c;我在 Twitter 上看到一篇帖子&#xff0c;展示了 Go 1.23&#xff08;2024 年 8 月&#xff09;即将推出的 Go 迭代器设计。据我所知&a…

35 Debian如何配置Postfix+Dovecot

作者:网络傅老师 特别提示:未经作者允许,不得转载任何内容。违者必究! Debian如何配置Postfix+Dovecot 《傅老师Debian知识库系列之35》——原创 ==前言== 傅老师Debian知识库特点: 1、拆解Debian实用技能; 2、所有操作在VMware虚拟机实测完成; 3、致力于最终形成Deb…

网安人必备!开源网络安全工具TOP 10(附下载地址)

工欲善其事&#xff0c;必先利其器。对于广大的网络安全从业者&#xff0c;以及未来想要从事网络安全的人来说&#xff0c;选择并善用合适的网络安全工具&#xff0c;能有效提升工作效率。 开源网络安全工具之所以能够在众多安全解决方案中脱颖而出&#xff0c;不仅是因为它们…

1.22 LeetCode总结(基本算法)_位运算

进制的概念 进制即进位计数制&#xff0c;是利用固定的数字符号和统一的规则的带进位的计数方法。 任何一种进位计数制都有一个基数&#xff0c;基数为 X 的进位计数制称为 X 进制&#xff0c;表示每一个数位上的数运算时都是逢 X 进一。 504. 七进制数 手法1&#xff1a;当…

小林图解系统-二.硬件结构 2.4CPU缓存一致性

CPU Cache的数据写入 CPU和内存的访问性能越差越大&#xff0c;于是在CPU内部嵌入CPU Cache(高速缓存)。 CPU Cache由Cache Line组成&#xff0c;Cache Line由头标志Tag数据块Data Block组成。 如果数据写入Cache&#xff0c;内存和Cache相对应的数据将不同&#xff0c;需要…

排序(3)【归并排序】【计数排序】【排序算法度及其稳定性分析】

一.归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是建立在归并操作上的一种有效的排序算法,该算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每个子序列有…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(六)质量改进系统方法与工具

第七节 质量改进系统方法与工具 1 质 量 改 进 方 法 概 述 可以说几乎每种质量管理领域的方法与工具都可以用于质量改进&#xff0c;但是一个组织在改进的整体推进中&#xff0c;往往不是采用单一的方法&#xff0c;会涉及多种改进的工具和手段&#xff0c;并依据一定的模式…

虹科免拆诊断案例 | 2022款问界M5增程式混合动力车充电口盖指示灯不工作

故障现象 一辆2022款问界M5增程式混合动力车&#xff0c;搭载1.5T发动机和发电机作为增程器&#xff0c;累计行驶里程约为3.6万km。该车因尾部受到碰撞进厂维修&#xff0c;维修后进行慢充&#xff0c;发现充电口盖指示灯不点亮&#xff08;图1&#xff09;&#xff0c;但仪表…

开放式运动耳机哪个品牌音质好用又实惠?五款2024高口碑产品精选力荐!

​开放式运动耳机在如今社会中已经迅速成为大家购买耳机的新趋势&#xff0c;深受喜欢听歌和热爱运动的人群欢迎。当大家谈到佩戴的稳固性时&#xff0c;开放式耳机都会收到一致好评。对于热爱运动的人士而言&#xff0c;高品质的开放式运动耳机无疑是理想之选。特别是在近年来…

要颜值有颜值,有性价比有性价比,华硕天选键、鼠组合分享

作为ROG产品的忠实粉丝&#xff0c;用过不少ROG 相关的产品&#xff0c;近期华硕天选TX98和天选MINI 鼠标的发布&#xff0c;独特配色令我眼前一亮。 华硕天选TX98键盘&#xff0c;作为新品&#xff0c;从看上的第一眼就觉得这款键盘是非常值得推荐。 它完美地诠释了潮玩新次元…

联想618收官:以69亿销售额勇夺15冠王

随着6月19日零点钟声的响起&#xff0c;今年的618年中大促正式落下帷幕。在这个备受瞩目的购物狂欢节里&#xff0c;联想凭借出色的产品表现和市场策略&#xff0c;再次展现了其强大的品牌实力和市场号召力。 数据显示&#xff0c;在今年618活动期间&#xff0c;联想全网销售额…

关于微信小程序(必看)

前言 为规范开发者的用户个人信息处理行为&#xff0c;保障用户的合法权益&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;微信要求&#xff0c;仅当开发者主动向平台同步用户已阅读并同意了小程序的隐私保护指引等信息处理规则…

elasticsearch的安装和配置

单节点安装与部署 我们通过docker进行安装 1.docker的安装 如果以及安装了docker就可以跳过这个步骤。 首先更新yum: yum update安装docker: yum install docker查看docker的版本&#xff1a; docker -v此时我们的docker就安装成功了。 2.创建网络 我们还需要部署kiban…

计算机专业毕设-springboot论坛系统

1 项目介绍 基于SSM的论坛网站&#xff1a;后端 SpringBoot、Mybatis&#xff0c;前端thymeleaf&#xff0c;具体功能如下&#xff1a; 基本功能&#xff1a;登录注册、修改个人信息、修改密码、修改头像查看帖子列表&#xff1a;按热度排序、按更新时间排序、查看周榜月榜查…

SSMP整合案例

黑马程序员Spring Boot2 文章目录 1、创建项目1.1 新建项目1.2 整合 MyBatis Plus 2、创建表以及对应的实体类2.1 创建表2.2 创建实体类2.2.1 引入lombok&#xff0c;简化实体类开发2.2.2 开发实体类 3、数据层开发3.1 手动导入两个坐标3.2 配置数据源与MyBatisPlus对应的配置3…

创建第一个Springboot项目(环境准备、环境存在的问题、启动时存在的问题、启动的方式)

一、环境准备 专业版创建springboot&#xff0c;直接有一个选项可以选择 社区版&#xff0c;需要下载一个spring的插件 不要直接点 install 因为这个插件是付费的&#xff0c;直接点安装只有30天使用期限 在里面找免费版本的下载 然后安装 安装完成后&#xff0c;这个插件名会变…

记一次生产事故,来来回回搞了一个月

&#x1f345;我是小宋&#xff0c;关注我&#xff0c;带你轻松过面试 读源码。提升简历亮点&#xff08;14个demo&#xff09; &#x1f30f;号&#xff1a;tutou123com。拉你进专属群。 记一次生产事故&#xff0c;来来回回搞了一个月 背景 我们的主要业务是台湾省的一个小…