【字符串函数2】

5. strncpy 函数的使用和模拟实现

选择性拷贝

cs 复制代码
char * strncpy ( char * destination, const char * source, size_t num );

1.拷贝num个字符从源字符串到目标空间。

2.如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边 追加0 ,直到num个。

测试

cs 复制代码
int main()
{
	char arr1[] = "abcd";
	char arr2[10] = { 0 };
	strncpy(arr2, arr1, 3);
	
	printf("%s", arr2);
	return 0;
}

结果:

模拟实现:

cs 复制代码
char* my_strncpy(char* dest, const char* src, size_t num) 
{
	char* ret = dest;//把初始地址放在ret
	assert(dest && src);//两者不能为空值 
	while (num--)
	{
		*(char*) dest = *(char*) src;//  这样也行  * dest = *src;  用char* 是把进行一个字节逐步进行替换
		dest++;
		src++;
	}
	return ret;
}
int main()
{
	char arr1[] = "abcd";
	char arr2[10] = { 0 };
	my_strncpy(arr2, arr1, 3);
	printf("%s", arr2);
	return 0;
}

6.strncat函数的使用和模拟实现

选择性字符串拼接 拼接后默认添加 '\0'

cs 复制代码
char * strncat ( char * destination, const char * source, size_t num );

1.将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字

2.如果source指向的字符串的⻓度小于num的时候,只会将字符串中到\0 的内容追加到destination指向的字符串末尾

测试

cs 复制代码
int main()
{
	char arr1[10] = "abcd";
	char arr2[10] = "efg";
	strncat(arr1, arr2, 3); //在arr1后拼接arr2
	printf("%s", arr1);
	return 0;
}

结果:

模拟实现:

cs 复制代码
char*  my_strncat(char* dest, const char* src, size_t num)
{
	assert(dest && src);
	char* ret = dest;

	//主要是把dest遍历便  到达dest的字符串的结尾  然后把src增加到dest后面
	while (*dest)
	{
		dest++;
	}
	while ((*dest++ = *src++) && num--) {

	}
	*dest = '\0';
	return 0;
}
int main()
{
	char arr1[10] = "abcd";
	char arr2[10] = "efg";
	my_strncat(arr1, arr2, 3); //在arr1后拼接arr2
	printf("%s", arr1);
	return 0;
}

7.strncmp函数的使用

比较:选择性两字符串的比较

cs 复制代码
int strncmp ( const char * str1, const char * str2, size_t num );

比较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回

cs 复制代码
int main()
{
	char arr1[10] = "abcd";
	char arr2[10] = "efg";
	int ret=strncmp(arr1, arr2, 3); //再arr1后拼接arr2
	printf("%d",ret);
	return 0;
}

结果:

8.strstr 的使用和模拟实现

在一个字符串中查找一个字符串

cs 复制代码
char * strstr ( const char * str1, const char * str2)
 //函数返回字符串str2在字符串str1中第⼀次出现的位置 之后的内容

测试

cs 复制代码
int main()    
{
	char arr1[] = "this is an apple";
	const char* p = "is";
	char* ret=strstr(arr1, p);
	printf("%s", ret);
	return 0;
}

模拟实现:

cs 复制代码
char* mystrstr(const char* str1, const char* str2)
{
	//设置两个固定位置的指针
	const char* s1 = NULL;
	const char* s2 = NULL;

	//设置要查找字符串的位置
	const char* cur = str1;
	//首先判断要查找的是否为空
	if (*str2 == '\0')
		return (char*)str1;
	//进行查询
	while (*cur)    //当*cur!='\0'
	{
		s1 = cur;
		s2 = str2;
		//满足以下要求   否则无法查询   原字符串和被查找字符串都不能为 '\0'   
		while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2)
		{
			s1++;
			s2++;     //两者遇到 同时增加
		}
		//当被查找的查到   '\0'  则查找完成
		if (*s2 == '\0')
		{
			return cur;
		}
		cur++;
	}
	return NULL;
}
int main()    
{
	char arr1[] = "this is an apple";
	const char* p = "is";
	char* ret= mystrstr(arr1, p);
	printf("%s", ret);

}
相关推荐
会编程的土豆11 分钟前
【数据结构与算法】二叉树遍历 集合
数据结构·算法
老虎062712 分钟前
LeetCode热题100 刷题笔记(第六天)双指针 「 盛最多水的容器」
笔记·算法·leetcode
ZPC821012 分钟前
fanuc 机器人 pr 寄存器数据如何绑定 GO 绑定DO
人工智能·算法·机器人
LUVK_22 分钟前
第六章 图
数据结构·考研·算法·深度优先·图论·408
Frostnova丶41 分钟前
LeetCode 735 & 2751.栈模拟碰撞问题详解
算法·leetcode
IT大师兄吖1 小时前
Qwen3-ASR 1.7B 音频转字幕 懒人整合包
人工智能·算法·音视频
爱丽_1 小时前
数据库索引为什么选 B+ 树:InnoDB 聚簇索引、回表与覆盖索引
数据库·算法·哈希算法
wfbcg1 小时前
每日算法练习:LeetCode 28. 找出字符串中第一个匹配项的下标 ✅
算法·leetcode·职场和发展
学而要时习1 小时前
强化学习:从“试错进化“到“推理革命
c语言·人工智能·python·语言模型
wengqidaifeng1 小时前
备战蓝桥杯----C/C++组 (三)算法讲解前言
c语言·c++·蓝桥杯