一、strcpy函数说明
还是老规矩我们来cplusplus看看strcpy的函数说明
从这个说明中我们总结出几个注意事项:
- 源字符串必须以'\0'结束。
- 会将源字符串中的'\0'拷贝到目标空间
- 目标空间必须要足够大,以确保能存放源字符串
- 目标空间必须可修改(所以const修饰要慎用)
二、strcpy实现思路
针对函数说明,我们函数的实现思路其实挺简单的
-
初始化目标指针:在函数内部,首先需要声明一个指针,通常命名为
p
或类似的名字,初始化为指向目标字符串的开始位置。 -
检查源字符串:使用一个循环来遍历源字符串的每个字符,直到遇到终止的空字符
'\0'
。 -
复制字符:在循环中,每次将源字符串的当前字符复制到目标字符串的当前位置,然后将目标指针向前移动一位。
-
处理终止字符:当循环结束时,即遇到源字符串的终止空字符,需要将这个空字符复制到目标字符串的相应位置。
-
返回目标字符串:函数返回目标字符串的指针。
-
函数定义:因为我们要返回的是字符串的指针那么我们的函数定义应该是char * my_strcpy(char * dest,const cahr * src)这里是因为目标空间必须可修改所以char *dest不能用const修饰。
三、strcpy模拟实现
好啦现在根据我们的思路来实现以下吧,代码中提及到的assert和const我在深入探寻指针奥秘中有提到,这里不再赘述啦。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <assert.h>
char* my_strcpy(char* dest, const char* src) {
char* p = dest; // 保存目标字符串的起始位置
assert(dest && src); // 确保目标和源字符串指针不为空
while ((*dest++ = *src++)) {
// 循环直到遇到源字符串的终止字符'\0'
}
return p; // 返回目标字符串的起始位置
}
int main() {
char a[] = "abc"; // 使用字符数组而不是指针
char b[10]; // 目标字符串的存储空间
my_strcpy(b, a);
printf("%s\n", b); // 直接打印b,因为b是字符数组,不是指针
return 0;
}
在函数内部,声明了一个char*
类型的指针p
,并将其初始化为指向目标字符串的起始位置。
while ((*dest++ = *src++)) { ... }
在这个循环中,执行以下操作:
将src
指向的字符赋值给dest
指向的位置。
将dest
和src
都向前移动一位(即指向下一个字符)。
循环继续,直到*src
为'\0'
。
当源字符串的终止字符被复制后,函数返回目标字符串的起始位置。
好啦到这里我们到这里我的strcpy函数模拟实现就完成啦,大家自己上手练习一下吧。