strcpy函数和strcat函数的使用及实现

一、strcpy函数

strcpy函数的作用是复制字符串,strcpy是C语言的一个标准库函数 ,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char*。它是string copy(字符串复制)的缩写。

1.1代码展现

#include<stdio.h>
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "boy";
	strcpy(arr1, arr2);
	//我们要把arr2拷贝到arr1中,希望arr1变成boy,而不是boydefghi,所以要把arr2的\0也拷贝过去
	printf("%s", arr1);
	return 0;
}

1.2注意要点

1.2.1源字符串必须以\0结束

举个反例,见代码:

#include<stdio.h>
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = {'b','o','y'};
	strcpy(arr1, arr2);
	//源字符串arr2中不包含\0,当程序运行起来的时候,会一直往后越界访问,直到遇到\0,函数才会结束
	printf("%s", arr1);
	return 0;
}

程序会紊乱,arr1将变得很“奇怪”!

1.2.2会将源字符串中的\0拷贝到目标空间

arr2中的’b’,‘o’,‘y’,'\0’一起被拷贝到arr1中,并替换掉arr1中的前四个元素。
实际上是arr1变成了 ‘b’ ‘o’ ‘y’ ‘\0’ ‘e’ ‘f’ ‘g’ ‘h’ ‘i’ ‘\0’,遇到第一个\0便不再往下访问了,所以arr1打印出boy

1.2.3目标空间必须足够大,以确保能够存放源字符串

举个反例,见代码:

#include<stdio.h>
int main()
{
	char arr1[] = "a";
	char arr2[] = "boy";
	strcpy(arr1, arr2);
	//源字符串比目标字符串大,当函数运行起来的时候会越界访问,程序报错
	printf("%s", arr1);
	return 0;
}

程序报错:

1.2.4目标空间必须可改变

同样举个反例:

#include<stdio.h>
int main()
{
	char* arr1 = "abcdefghi";
	char arr2[] = "boy";
	strcpy(arr1, arr2);
	//目标字符串arr1内容不可被改变,此时运行程序会崩溃
	printf("%s", arr1);
	return 0;
}

程序崩溃,在visual studio2022不输出任何内容。

1.3实现

//模拟实现
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	assert(dest);
	assert(src);
	char* ret = dest;
	//拷贝src指向的字符串到dest指向的空间,包括\0
	while (*dest++ = *src++)//比如当把元素b拷贝过去时候,该式子的结果就是b,把\0拷贝过去时,结果就是0
	{
		;
	}
	//返回目的地的空间的起始地址
	return ret;
}
int main()
{
	char arr1[] = "abcdefghi";
	char arr2[] = "boy";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
}

二、strcat函数

strcat是字符串连接函数,把src所指向的字符串(包括“\0”)复制到dest所指向的字符串后面(删除* dest原来末尾的“\0”)。要保证* dest足够长,以容纳被复制进来的*src。*src中原有的字符不变。返回指向dest的指针。

2.1代码展现

#include<stdio.h>
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

2.2注意要点

2.2.1目标空间必须有足够大的空间

目标空间要容得下目标空间的字符串加上源字符串
举个反例:

#include<stdio.h>
int main()
{
	char arr1[] = "hello";
	char arr2[] = "world";
	//目标空间必须足够大。目标空间太小了,无法容下helloworld
	strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}

此时程序报错:

2.2.2源字符串必须以\0结束

这里的道理和上面strcpy函数一样,不再举例了。(见上文1.2.1)

2.2.3目标空间必须可改变

道理同样和strcpy函数一样,也不再重复了。(见上文1.2.4)

2.2.4不能自己给自己追加

(请参考下面的图和实现代码)
当使用strcpy,arr1自己给自己追加时,'h’覆盖了‘\0’,于是arr1就没有\0了,于是这个函数永远都不会停下来,程序崩溃!

2.3实现

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	assert(dest && src);
	char* ret = dest;
	//1、找到目的字符串的\0
	while(*dest!='\0')
	{
		dest++;
	}
	//2、追加
	while(*dest++=*src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[30] = "hello";
	char arr2[] = "world";
	//调试时打开监视,若某一个x变成了\0,则说明\0也被传递过去了。
	my_strcat(arr1, arr2);
	printf("%s\n", arr1);
	return 0;
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值