C语言 strcpy 函数的实现及注意点

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’ 。
发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();