【C语言】字符串函数下

👑个人主页:啊Q闻

🎇收录专栏:《C语言》

🎉道阻且长,行则将至

前言

这篇博客是字符串函数下篇,主要是关于长度受限制的字符串函数(strncpy,strncat,strncmp)的使用和模拟实现,还有一些字符串函数的相关知识。

一.strncpy

1.使用

注1:拷贝num个字符从源字符串到目标空间

注2:如果源字符串的长度小于num,则拷贝完源字符串之后,在后面追加'\0',直至到num个。

运行结果:

注2解释:

2.模拟实现

cpp 复制代码
char* my_strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	int i = 0;
	while (i < num)//打印拷贝字符,以拷贝字符数作为限制条件
	{
		*dest = *src;
		dest++;
		src++;
		i++;
	}
	*dest = '\0';
	return ret;
}

二.strncat

1.使用

注1:将source指向的字符串的前num个字符追加到destination指向的字符串末尾,再追加一个'\0'。

注2:如果sorce指向的字符串长度小于num时,只会将字符串中至'\0'前的内容追加到destination指向的字符串末尾

运行结果:

调试结果证明注1:

当num大于sorce字符串长度的时候,运行结果如下:

调试结果可证明注2:

2.模拟实现

cpp 复制代码
char* my_strncat(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest);
	assert(src);
	int i = 0;
	while (*dest)
	{
		dest++;
	}
	while (i < num)
	{
		*dest = *src;
		dest++;
		src++;
		i++;
	}
	*dest = '\0';
	return ret;
}

三.strncmp

1.使用

注1:该函数用于比较str1和str2的前num个字符,如果相等就继续往后比较,最多比较num个字母,如果提前发现不一样就提前结束

运行结果:

2.模拟实现

cpp 复制代码
int  my_strncmp(char* str1, const char* str2, size_t num)
{
	int i = 0;
	assert(str1);
	assert(str2);
	for (i = 0; i < num; i++)//循环限制条件为小于比较字符个数
	{
		if (*str1 == *str2)//如果比较相等就往后移
		{
			str1++;
			str2++;
		}
		else
		{
			return *str1 - *str2;//不相等就比较大小
		}
	}
	return 0;//当跳出循环时,证明两个字符串比较部分完全相等
}
	
int main()
{
	char s1[20] ="hello";
	char s2[] = "aello";
	int ret=my_strncmp(s1, s2, 3);
	printf("%d\n", ret);
	return 0;
}

也可以:

cpp 复制代码
int my_strncmp(char* str1, const char* str2, size_t num)
{
	int ret = 0;
	assert(str1);
	assert(str2);
	while (num--)
	{
		ret = *str1 - *str2;
		if (ret != 0)//不等于0就跳出,返回一个非0的数
			break;
		str1++;
		str2++;
	}
	return ret;//跳出整个循环时证明两个字符串比较部分相等
}

四.strstr

1.使用

注1:函数返回字符串str2在字符串str1第一次出现的位置

注2:字符串的比较匹配不包含\0字符,以\0结尾

运行结果:

2.模拟实现

cpp 复制代码
char* my_strstr(const char* str1, const char* str2)
{
	const char* cur = str1;
	const char* s1 = NULL;
	const char* s2 = NULL;
	assert(str1 && str2);
	if (*str2 == '\0')
	{
		return (char*)str1;
	}
	while (*cur)
	{
		s1 = cur;
		s2 = str2;
		while (*s1 == *s2 && *s1 && *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return (char*)cur;
		}
		cur++;
	}
	return NULL;

详解:

谢谢你的阅读,如果对你有帮助的,三连么么么

相关推荐
QX_hao1 小时前
【Go】--map和struct数据类型
开发语言·后端·golang
你好,我叫C小白1 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
Evand J3 小时前
【MATLAB例程】基于USBL和DVL的线性回归误差补偿,对USBL和DVL导航数据进行相互补偿,提高定位精度,附代码下载链接
开发语言·matlab·线性回归·水下定位·usbl·dvl
朱嘉鼎3 小时前
状态机的介绍
c语言·单片机
爱喝白开水a4 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway4 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康4 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
一碗绿豆汤4 小时前
c语言-流程控制语句
c语言
杰克尼4 小时前
JavaWeb_p165部门管理
java·开发语言·前端
一成码农4 小时前
JavaSE面向对象(下)
java·开发语言