文章目录
strcpy介绍;
自行定义函数实现strcpy功能的几种方法;
各自的优缺点;
strcpy介绍
strcpy是一种C语言的标准库函数,strcpy把从src地址开始且含有'\0'结束符的字符串复制到以dest开始的地址空间,返回值的类型为char*。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
自行定义函数实现strcpy功能的几种方法
1.直接将src中内容逐个赋值到dest中,实现strcpy功能:
# include <stdio.h>
void my_strcpy(char *dest, char *src)
{
while (*src != '\0') //完成字符串中各元素的复制;
{
// *dest = *src;
// *src++;
// *dest++;
*dest++ = *src++;
}
*dest = *src; //完成字符串结束标志'\0'的复制;
}
int main()
{
char arr1[] = "############";
char arr2[] = "hello";
my_strcpy(arr1, arr2); //定义my_strcpy函数;
printf("%s\n", arr1); //打印结果hello;
return 0;
}
2.判断指针的有效性后,若无效程序不执行,若有效,将src中内容逐个赋值到dest中,实现strcpy功能:
# include <stdio.h>
void my_strcpy(char *dest, char *src)
{
if (dest != NULL && src != NULL) //判断指针的有效性;
{
while (*dest++ = *src++)
{
;
}
}
}
int main()
{
char arr1[] = "############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
3.判断指针的有效性,若无效进行错误提示,若有效,将src中内容逐个赋值到dest中,实现strcpy功能:
# include <stdio.h>
# include <assert.h>
void my_strcpy(char *dest, const char *src)// const防止src中内容被修改,保护源字符串;
{
assert(dest != NULL);//断言,判断指针的有效性,若指针无效则打印一条错误信息进行提示;
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
}
int main()
{
char arr1[] = "############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
4.判断指针的有效性,若无效进行错误提示,若有效,将src中内容逐个赋值到dest中,最终通过返回dest值,实现strcpy功能:
# include <stdio.h>
# include <assert.h>
char * my_strcpy(char *dest, const char *src)
{
char * ret = dest;
assert(dest != NULL);
assert(src != NULL);
while (*dest++ = *src++)
{
;
}
return ret; //通过返回值的形式实现拷贝功能,增加函数可用性;
}
int main()
{
char arr1[] = "############";
char arr2[] = "hello";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
各自的优缺点
方法一不检查指针的有效性,不注重代码的健壮性;方法二虽判断了指针的有效性,但并没有给出错误的解决办法,导致程序在后期运行中不易维护;方法三比较好的实现了指针的有效性的判断,加强了代码的健壮性,但是函数定义部分功能不能体现函数的单一功能性,后期的可用性不是很强;方法四在三的基础上,采用返回值的形式,支持链式表达式,增加了函数的"附加值",提高了可用性,方便调用者的使用,增强了程序的可维护性。
不足之处,请多指教!