strcpy函数和strncpy函数的使用和模拟使用

strcpy函数和strncpy函数的参数类型

strcpy参数类型:
在这里插入图片描述
strncpy参数类型:
在这里插入图片描述

strcpy函数和strncpy函数的区别

从参数类型可以看出strncpy函数比strcpy函数多个参数num,其作用是从源复制的最大字符数。当想只从源复制指定字符时候可以使用。

strcpy函数使用

strcpy函数使用:

int main()
{
	char arr1[] = "hello babc";
	char arr2[20] = "xxxxxxxxxxxxx";
	strcpy(arr2, arr1);//拷贝的时候也会把''拷贝过去
	printf("%s
", arr2);
	return 0;
}

strcpy函数使用注意事项:

1.源字符串中必须包含,同时也会被拷贝到目标空间
2.程序员自己要保证目标空间要足够大,能放得下拷贝来的数据
3.保证目标空间必须可以修改

如果目标空间不够大,会发生什么

int main()
{
	char arr1[] = "hello babc";
	char arr2[5] = "xxxx";
	strcpy(arr2, arr1);//拷贝的时候也会把''拷贝过去
	printf("%s
", arr2);
}

调试时会报错,因为目标空间越界访问

在这里插入图片描述
如果目标空间不可更改,会发生什么

int main()
{
	char arr1[4] = "abc";
	const char*p = "efgsduysdgf";//常量字符串不可以被修改
	strcpy(p, arr1);
	printf("%s
", p);
	return 0;
}

调试时会报错,因为目标空间不可更改
在这里插入图片描述

如果数组没有包含,会发生什么

int main()
{
	char arr1[] = { 'a','b','c' }; 
	char arr2[10] = "xxx";
	strcpy(arr2, arr1);//strcpy遇到才会停下来,可能会造成数组越界访问从而报错
	printf("%s
", arr2);
	return 0;
}

调试时会报错,因为源目标越界访问

在这里插入图片描述

strcpy函数模拟实现

strcpy 功能是将源字符串的内容拷贝到目标空间
期望目标空间的内容发生改变
所以返回目标空间的起始的地址,方便观察目标空间的数据

char* my_strcpy(char* dest, const char* src)
{
	char* ret = dest;

	assert(dest);
	assert(src);

	while (*dest++ = *src++) {;}
	return ret;//目标空间的起始地址返回
}

int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	//链式访问
	printf("%s
", my_strcpy(arr2, arr1));

	return 0;
}

strncpy函数使用

为了防止strcpy函数使用的可能会发生的错误,我们可以使用strncpy函数,在拷贝的时候可以限制拷贝数量以防止目标空间不够而越界发生错误。

int main()
{
	char arr1[10] = "xxxxxxx";
	char  arr2[] = "scscsdc";
	strncpy(arr1, arr2, 3);
	printf("%s
", arr1);
}

strncpy函数的模拟实现

char* my_strncpy(char* des, const char* sou, size_t num)
{
	char* ret = des;
	assert(des && sou);
	while (num)
	{
		*des++ = *sou++;
		num--;
	}
	return ret;
}
int main()
{
	char arr1[10] = { 0 };
	char arr2[] = "abcsddff";
	my_strncpy(arr1, arr2, 5);
	printf("%s
", arr1);
}