C语言-strcpy(复制函数的使用和模拟)

本文详细解释了C语言中的strcpy函数,包括其功能、参数、返回值以及潜在的缓冲区溢出问题。同时介绍了如何通过模拟函数my_strcat实现更安全的字符串拷贝,并提供了示例代码和注意事项。

strcpy(复制函数的使用和模拟)

语法讲解

`strcpy` 是一个在 C 语言中常用的字符串拷贝函数,它定义在标准库头文件 `<string.h>` 中。该函数用于将源字符串(source string)复制到目标字符串(destination string)中,直到遇到换行符、null 字符(`'\0'`),或者到达目标字符串末尾。

函数原型定义如下:
```c
char *strcpy(char *dest, const char *source);
```
参数说明:
- `dest`:指向目标字符串的指针,即要复制字符串到的位置。
- `source`:指向源字符串的指针,即要被复制的内容。

返回值:
- 函数返回指向目标字符串的指针,即 `dest`。
功能:
- 将源字符串 `source` 中的字符逐个复制到目标字符串 `dest` 中,直到遇到换行符、null 字符或目标字符串结束。
- 复制过程中,如果源字符串长度大于目标字符串的长度,则会截断源字符串;如果两者长度相同,则只有前 n-1 个字符被复制(n 为目标字符串的长度)。
- 该函数不检查目标字符串是否有足够的空间来存放源字符串的内容,因此如果目标字符串空间不足,可能会导致缓冲区溢出。

示例代码:
```c
#include <stdio.h>
#include <string.h>
int main() {
    char source[] = "Hello, World!";
    char dest[20]; // 确保这个数组足够大,能够存放 source 字符串
    // 使用 strcpy 拷贝字符串
    strcpy(dest, source);
    printf("Copied string: %s\n", dest);
    return 0;
}
```
当运行上述代码时,它会输出:
```
Copied string: Hello, World!

注意事项:
- 使用 `strcpy` 时要注意目标字符串数组的大小,以避免缓冲区溢出的问题。
- 在实际项目中,为了安全起见,更推荐使用其他的字符串拷贝函数,如 `strncpy`,它允许你指定最大拷贝的字符数,从而减少溢出的风险。
- 在某些嵌入式系统或对性能要求极高的场景中,可能不会使用标准库中的函数,而是采用更高效的实现方式。 

也就是可以理解为

strcpy(拷贝(arr2)(空),被拷贝(arr1)(有数值));

拷贝原理 

就是逐个拿下来,直到遇见最后一个字符‘\0’,然后把'\0'也拿过来

图解 

需要知道常量字符串是不能被修改的

数组就是变量

char*arr="ffsdfsd";这个是常量

strcpy的模拟

版本1

版本2

后置++ 也就是先拷贝 后++

并且这个函数的返回值是char

返回值是需要返回起始地址

模拟代码总结

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* arr1, char* arr2)
{
	assert(arr1 && arr2);//保证代码的健壮性
	char* ret = arr1;
	while (*arr1++ = *arr2++)//这里不建议*arr1++=*arr2++ 可以写成把++ 放在循环里面写 这样初学者出错的可能性比较小,这里的意思就是当把arr2里面的元素放到arr1里面的时候 此时在++直到遇见字符串0 跳出循环
	{
		;
	}
	*arr1 = *arr2;//这里是关键的一步骤 也就是把'\0'放到最后 可以看看最后我写的图解

	return ret;//这里是返回首元素的地址 返回首元素的地址进行打印
}
void  MY_strcat(char* arr1, char* arr2)
{
	assert(arr1 && arr2);//保证代码的健壮性
	while (*arr1++ = *arr2++)//这里是同理的
	{
		;
	}
	*arr1 = *arr2;//这里是关键的一步骤 也就是把'\0'放到最后
}
int main()
{
	char arr1[] = "ao;isdh;a";
	//这里是strcpy函数的使用 也就是arr2 是空的 这里需要记住 如果你要拷贝的函数占据的是10个字节 那么你拷贝到的空间 最少也得10个空间 这样才能放下这些元素
	char arr2[100] = { 0 };
	char arr3[100] = { 0 };
	char arr4[100] = { 0 };

	strcpy(arr2, arr1);
	//这里是strcpy函数的使用 也就是arr2 是空的 这里需要记住 如果你要拷贝的函数占据的是10个字节 那么你拷贝到的空间 最少也得10个空间 这样才能放下这些元素
	printf("%s \n%s\n\n", arr1, arr2);

	char* my = my_strcat(arr3, arr1);
	printf("%s \n%s\n\n", arr1, my);

	 MY_strcat(arr4, arr1);
	printf("%s \n%s\n\n", arr1, arr4);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值