详解模拟实现strncpy、strncat、strncmp

模拟实现strncpy:

strncpy函数的参数有:

char* strncpy(char* destination, const char* source, size_t num);

该函数所实现的功能为:

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

2:如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。

模拟实现:

char my_strncpy(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	int i = 0;
	assert(dest && src);	//用assert断言保证其不为野指针
	
	//1.用while循环实现将拷贝num个字符从源字符串到目标空间。

	//设置跳出循环条件->当源字符串走到'/0'或拷贝到第num个字符
	while (*src && i < num)		
	{
		*ret++ = *src++;
		i++;
	}
	
	//2.满足第2个条件->	
	//如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
	for (int j = i; j < num; j++)
	{
		*ret++ = 0;
	}

	return ret;
}

//功能演示:
int main()
{
	char arr1[20] = "Hello World";
	char arr2[] = "World Hello";
	my_strncpy(arr2, arr1, 5);
	printf("%s\n", arr2);
	return 0;
}

演示结果:

模拟实现strncat:

strncat函数的参数有:

char* strncat(char* destination, const char* source, size_t num);

该函数实现的功能为:

1:将源字符串的num个字符追加到目标字符串的结尾。

2:追加完n个字符后会自动放\0

3:如果源字符串的长度小于num,则拷贝完源字符串之后会直接\0结尾,不会再追加

模拟实现:

char my_strncat(char* dest, const char* src, size_t num)
{
	char* ret = dest;
	assert(dest && src);
	
	//通过while循环走到目标字符串结尾('\0')处
	
	while (*dest)
	{
		dest++;
	}

	//实现追加源字符串的num个字符到目标空间中:

	//设置跳出循环条件->
	//如果源字符串的长度小于num,则拷贝完源字符串之后会直接\0结尾,不会再追加
	//或追加完源字符串的第num个字符至目标字符串
	while (*src && num--)
	{
		*dest++ = *src++;
	}

	*dest = '\0';
	return ret;
}

//功能演示:
int main()
{
	char arr1[20] = "Hello ";
	char arr2[20] = "World!xxx";
	my_strncat(arr1, arr2, 6);
	printf("%s\n", arr1);
	return 0;
}

演示结果:

模拟实现strncmp:

strncmp函数的参数有:

int strncmp(const char* str1, const char* str2, size_t num);

该函数实现的功能为:

1:比较两个字符串的num个字符对应位置上字符的大小(ASCII值)

2:标准规定:

第一个字符串大于第二个字符串,则返回大于0的数字

第一个字符串等于第二个字符串,则返回0

第一个字符串小于第二个字符串,则返回小于0的数字

3:比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。

模拟实现:

int my_strncmp(const char *str1, const char *str2, size_t num)
{
	assert(str1 && str2);

	//如果传参为0,比较0个字符则直接返回0
	if (num == 0)
		return 0;

	//设置循环跳出条件

	//当str1与str2不相等时
	//当str1字符为空字符串时
	//当比较完对应位置的第num个字符时
	while ((*str1 == *str2) && *str1 && --num)
	{
		str1++;
		str2++;
	}
	//通过比较对应位置字符的ASCII值大小相减返回一个大于/小于/等于0的值
	return *str1 - *str2;
}

//功能演示:
int main()
{
	char arr1[20] = "aabbccdd";
	char arr2[] = "aabccd";
	int n = my_strncmp(arr1, arr2, 4);
	printf("%d\n", n);
	return 0;
}

演示结果:

这里返回的是小于0的数字也就是第四个对应位置上的str1与str2的b和c,对应位置上的ASCII值为98和99。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值