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

详解:

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

相关推荐
侃侃_天下1 天前
最终的信号类
开发语言·c++·算法
echoarts1 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix1 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题1 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说1 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔1 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔1 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机
liujing102329291 天前
Day03_刷题niuke20250915
c语言
我是菜鸟0713号1 天前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_1 天前
QT(4)
开发语言·汇编·c++·qt·算法