strcpy和strncpy

21 篇文章 0 订阅
9 篇文章 0 订阅

strcpy

我们先来看看在msdn中是如何解释这个函数的:

char *strcpy( char *strDestination, const char *strSource );

The strcpy function copies strSource, including the terminating null character, to the location specified by strDestination.

strcpy函数将strSource(包括终止的空字符)复制到strDestination指定的位置。

这里有几点需要注意:

	1. 源字符串必须以'\0'作为结尾
	2. strcpy函数会将源字符串中的'\0'也拷贝至目标空间
	3. 目标空间必须足够大,至少要大于等于源字符串所占空间
	4. 目标空间必须是也变的,也就是说不可以是常量字符串

那么知道了这些,我们就来模拟实现一下strcpy函数:

char *MyStrcpy(char* dst, const char* src)
{
	char* p = dst;
	assert(dst && src);//断言dst和src都不为空
	while (*src != '\0')
	{
		*dst = *src;
		src++;
		dst++;
	}
	*dst = '\0';
	return p;
}
int main()
{
	char arr[20] = "abcdef";//保证目标空间足够大
	const char* arr1 = "zxcvbn";
	char* ret = MyStrcpy(arr,arr1);
	printf("%s", ret);
	return 0;
}

我们来看一下程序的输出结果:
在这里插入图片描述
非常的完美

strncpy

char *strncpy( char *strDest, const char *strSource, size_t count );

The strncpy function copies the initial count characters of strSource to strDest and returns strDest. If count is less than or equal to the length of strSource, a null character is not appended automatically to the copied string. If count is greater than the length of strSource, the destination string is padded with null characters up to length count.

strncpy函数将strSource的初始计数字符复制到strDest并返回strDest。如果count小于或等于strSource的长度,则不会将空字符自动附加到复制的字符串中。如果count大于strSource的长度,则目标字符串将填充长度count以内的空字符。

这里需要解释的是:

	1.strncpy是从源字符串中拷贝count个元素到目标空间中
	2.如果源字符串的长度小于count,那么就在后面一直追加0直到count个

同样的我们来模拟实现一下strncpy函数:

char* MyStrncpy(char* dst, const char* src, size_t count)
{
	char* p = dst;
	const char* q = src;
	assert(dst && src);
	if (count < strlen(src) + 1)
	{
		while (*src != *(q + count))
		{
			*dst = *src;
			src++;
			dst++;
		}
		return p;
	}
	else
	{
		while (*src != '\0')
		{
			*dst = *src;
			src++;
			dst++;
		}
		for (size_t i = 0; i < (count - strlen(src)); i++)
		{
			*(dst + i) = '\0';
		}
		return p;
	}
}
int main()
{
	char arr[20] = "abcdefqwerty";
	const char* arr1 = "zxcvbn";
	char* ret = MyStrncpy(arr, arr1, 3);
	printf("%s", ret);
	return 0;
}

我们来看一下程序的输出结果:
在这里插入图片描述

非常的完美。

以上就是我今天想分享给大家的内容,如果有错误的或者可以改进的地方,欢迎大佬联系我。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值