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

详解:

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

相关推荐
名誉寒冰几秒前
GDB 调试与 Core Dump(段错误)排查指南(Linux/C/C++)
linux·c语言·c++
Insight.24 分钟前
背包问题——01背包、完全背包、多重背包、分组背包(Python)
开发语言·python
aini_lovee26 分钟前
改进遗传算法求解VRP问题时的局部搜索能力
开发语言·算法·matlab
Yeniden1 小时前
Deepeek用大白话讲解 --> 迭代器模式(企业级场景1,多种遍历方式2,隐藏集合结构3,Java集合框架4)
java·开发语言·迭代器模式
SmoothSailingT1 小时前
C#——LINQ方法
开发语言·c#·linq
景川呀1 小时前
Java的类加载器
java·开发语言·java类加载器
k***92161 小时前
Python 科学计算有哪些提高运算速度的技巧
开发语言·python
superman超哥1 小时前
仓颉条件变量深度解析与实践:解锁高效并发同步
开发语言·python·c#·仓颉
道法自然|~2 小时前
【PHP】简单的脚本/扫描器拦截与重要文件保护
开发语言·爬虫·php
GoWjw2 小时前
在C&C++中结构体的惯用方法
c语言·开发语言·c++