1、 strcpy 函数原型
char * strcpy(char* str1, const char* str2);
2、不使用库函数实现 strcpy 功能
// C语言 版本
#include <stdio.h>
char* MyStrcpy(char* str1, const char* str2)
{
char* temp = str1;
if (NULL == str1 || NULL == str2)
{
printf("Argument error!");
return NULL;
}
while (*str2 != '\0')
{
*str1++ = *str2++;
}
*str1 = '\0';
str1 = temp;
return str1;
}
int main()
{
char str1[20] = { 0 };
char* str2 = "String!";
MyStrcpy(str1, str2);
printf("%s\n", str1);
return 0;
}
运行结果:
3、注意点
- 函数参数如果是指针,并且作为输入参数,应该使用 const 修饰,防止指针在函数体内被修改;
- 注意检查传入参数的有效性,注重代码的健壮性。函数参数检查的几种区别:
- 使用(!str1 || !str2)或者(str1 && str2),这实际上是类型的隐式转换,将 char* 转换为 bool 类型,这种形式虽然简洁灵活,但是会导致出错概率增大和维护成本升高。
- 使用(str1 == 0 || str2 == 0),直接使用字面常量(本题中的0),会减少程序的可维护性,0虽然简单,但程序中可能出现很多处对指针的检查,万一出现手误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用 NULL 代替0,如果出现拼写错误,编译器就会检查出来。
- 使用 str == NULL ,如果在写的过程中漏写一个 = ,变成 str = NULL,编译器无法检测出错误,可能导致意想不到的错误。应该采用 NULL == str 这种方式,如果将表达式写成了赋值,编译器会马上报错。
- 注意保存原始的 str 值;
- 注意添加字符串结束标志 ‘\0’ 。