函数简介
strcpy - string copy 函数 - 字符串拷贝
#include#include int main() { char arr1[20] = { 0 }; char arr2[] = "hello world"; printf("%sn", strcpy(arr1, arr2)); return 0; }
使用库函数可实现字符串拷贝,现模拟实现my_strcpy
字符串拷贝,本质上是字符拷贝+字符++
#includevoid my_strcpy(char* des,char* src) { while (*src != '') { *des = *src; *des++;//数组向后移动一位 *src++; } *des = *src;//这里将''进行拷贝 } int main() { char arr1[20] = { 0 }; char arr2[20] = "hello world"; my_strcpy(arr1, arr2);//数组名就是数组首元素地址 printf("%sn",arr1); return 0; }
这串代码还可以优化
#includevoid my_strcpy(char* des,char* src) { while (*des++ = *src++)//des src 解引用后自加1,自动跳到下一个字符,使代码简化 { ;//空语句 } } int main() { char arr1[20] = {0}; char arr2[] = "hello world"; my_strcpy(arr1, arr2); printf("%sn",arr1); return 0; }
这串代码已经可以实现字符串拷贝了,但它含有问题,如果字符串arr1为NULL空指针时,char* des 就为野指针了,这个程序就会有bug
为防止传递NULL指针,可以使用assert(link)函数进行断言处理
这里使用NULL测试下
#include#include void my_strcpy(char* des, char* src) { assert(des != NULL); assert(src != NULL); while (*des++ = *src++) { ;//空语句 } } int main() { char arr1 = NULL; char arr2[] = "hello world"; my_strcpy(arr1, arr2); printf("%sn", arr1); return 0; }
为防止在模拟实现的过程中,des 与 src 表示不清而使程序出现失误,我们应该加const进行修饰
#include#include void my_strcpy(char* des,const char* src) { assert(des != NULL); assert(src != NULL); while (*des++ = *src++)//这里写反时,由于const修饰,会报错 { ;//空语句 } } int main() { char arr1[20] = {1}; char arr2[20] = "hello world"; my_strcpy(arr1, arr2); printf("%sn", arr1); return 0; }
但编写函数时我们使用的是void函数,而cplusplus.com上提供了char*类型, 故代码还可以进行优化
最终版本:
#include#include char* my_strcpy(char* des, const char* src) { assert(*des && *src); char* ret = des;//创建指针变量存放des 字符串 while (*des++ = *src++) { ; } return ret;//返回的是字符串数组的首元素地址 } int main() { char arr1[20]; char arr2[] = "hello world"; printf("%sn", my_strcpy(arr1, arr2));//连式访问 //''是字符串结束的标志,打印时遇到打印结束。 return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)