【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;

详解:

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

相关推荐
bzmK1DTbd3 小时前
Git版本控制:Java项目中的分支管理与合并策略
java·开发语言·git
Rust研习社3 小时前
为什么 Rust 没有空指针?
开发语言·后端·rust
kyriewen113 小时前
WebAssembly:前端界的“外挂”,让C++代码在浏览器里跑起来
开发语言·前端·javascript·c++·单元测试·ecmascript
SunnyByte5 小时前
C语言——贪吃蛇的实现
c语言·单链表·贪吃蛇
其实防守也摸鱼5 小时前
CTF密码学综合教学指南--第九章
开发语言·网络·python·安全·网络安全·密码学·ctf
砚底藏山河5 小时前
Python量化开发:2026最佳实时股票数据API接口推荐与对比
开发语言·windows·python
AlunYegeer6 小时前
JAVA,以后端的视角理解前端。在全栈的路上迈出第一步。
java·开发语言·前端
hixiong1236 小时前
C# OpenvinoSharp使用DINOv2模型进行图像相似度计算
开发语言·c#
DFT计算杂谈7 小时前
自动化脚本一键绘制三元化合物相图
java·运维·服务器·开发语言·前端·python·自动化
EW Frontier7 小时前
6G ISAC新范式:基于智能漏波天线的Wi‑Fi通感一体化系统设计与实测【附MATLAB+python代码】
开发语言·python·matlab·music·isac·doa·wi‑fi