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

详解:

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

相关推荐
醉城夜风~18 分钟前
(超详细)C++多态(Polymorphism)
开发语言·c++
这是个栗子21 分钟前
【JS代码分析】前端鉴权基础:Token 的本地存储与状态重置实践
开发语言·前端·javascript
wuyk55531 分钟前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法
SomeB1oody43 分钟前
【RustyML入门】5.3. 聚类指标
开发语言·后端·机器学习·rust·教程
OPEN-F1 小时前
Python进阶教程:Web开发入门(Flask)
开发语言·python
神仙别闹1 小时前
基于C++ MFC实现动态分区分配存储管理
开发语言·c++·mfc
for_ever_love__1 小时前
python基础语法学习: 类型注解
开发语言·python·学习
caimouse1 小时前
ReactOS 窗口系统架构分析
服务器·c语言
caimouse1 小时前
ReactOS 图形系统分析(46):DC 工具 — dcutil.c
c语言·开发语言
BreezeJuvenile1 小时前
嵌入式C语言常见考察点(2)
c语言·嵌入式