赞
踩
我今天为大家带来strcpy函数的自主实现,话不多说,直接开始。
声明:下面对strcpy函数说明而截取的图片,来自于软件MSDN
我们观看下面这张图片(来自软件MSDN)
点开MSDN软件,再点击索引,并且在下面边框中搜索strcpy来了解strcpy函数的作用,往下面翻,找到解析该函数的句子,如下:
翻译过来就是,strcpy将strSource,包括终止符号(\0),复制到strDestination,而strSource和strDestination是第一张图的一些内容,如下:
通过上面的分析,我们大致知道了strcpy的作用,接下来,我们来尝试实现这个函数。
我们创建字符数组,并且通过指针来实现strcpy函数。
#include<stdio.h> void my_strcpy (char* arr1,char* arr2) { while(*arr2!='\0') { //注意是后置加加 *arr1++ = *arr2++; } //拷贝\0 *arr1 = *arr2; } int main () { char arr1[] = "*******************"; char arr2[] = "hello world"; my_strcpy(arr1,arr2); //我们要实现arr2拷贝到arr,仿造库函数strcpy把arr2放在arr1后面 printf("%s\n",arr1); //打印arr1观察拷贝结果 return 0; }
由于上面一个程序的代码实行下,拷贝内容和拷贝\0是分开进行的,我们在这个地方进行优化。
#include<stdio.h> void my_strcpy (char* arr1,char* arr2) { //当拷贝\0完成后,返回0,判断为假,循环结束 while(*arr1++ = *arr2++) { ; } } int main () { char arr1[] = "*******************"; char arr2[] = "hello world"; my_strcpy(arr1,arr2); //我们要实现arr2拷贝到arr,仿造库函数strcpy把arr2放在arr1后面 printf("%s\n",arr1); //打印arr1观察拷贝结果 return 0; }
由上面的图片我们可以了解到,被拷贝的字符数组前面加上了const,而被覆盖的字符数组却没有,接下来,我们要了解const的作用。
函数const是关键字,赋予不可改变性。
const加在了strsource前面,防止在实行strcpy库函数时,将源头修改。
由此可见,我们的代码也进行优化。
#include<stdio.h> //赋予源头不可改变性,防止*arr1++和*arr2位置写错导致错误 void my_strcpy (char* arr1,const char* arr2) { //当拷贝\0完成后,返回0,判断为假,循环结束 while(*arr1++ = *arr2++) { ; } } int main () { char arr1[] = "*******************"; char arr2[] = "hello world"; my_strcpy(arr1,arr2); //我们要实现arr2拷贝到arr,仿造库函数strcpy把arr2放在arr1后面 printf("%s\n",arr1); //打印arr1观察拷贝结果 return 0; }
由图片可以知道,strcpy库函数是有返回值的,所以我们在模拟strcpy函数的需要设定返回值。
#include<stdio.h> //赋予源头不可改变性,防止*arr1++和*arr2位置写错导致错误 char* my_strcpy (char* arr1,const char* arr2) { //开头保存arr1,因为后面arr1不再是首元素地址 char* ret = arr1; //当拷贝\0完成后,返回0,判断为假,循环结束 while(*arr1++ = *arr2++) { ; } return ret; } int main () { char arr1[] = "*******************"; char arr2[] = "hello world"; printf("%s\n",my_strcpy(arr1,arr2)); //打印arr1观察拷贝结果 return 0; }
我们还需要考虑我们的strSource和strDestination不能被传入空指针,引用assert可以及时报出错误。
#include<stdio.h> #include<assert.h> //赋予源头不可改变性,防止*arr1++和*arr2位置写错导致错误 char* my_strcpy (char* arr1,const char* arr2) { char* ret; assert(arr1!=NULL); assert(arr2!=NULL); //开头保存arr1,因为后面arr1不再是首元素地址 ret = arr1; //当拷贝\0完成后,返回0,判断为假,循环结束 while(*arr1++ = *arr2++) { ; } return ret; } int main () { char arr1[] = "*******************"; char arr2[] = "hello world"; printf("%s\n",my_strcpy(arr1,arr2)); //打印arr1观察拷贝结果 return 0; }
这个便是最终的strcpy函数优化的最终版本了,喜欢的点个小红心,关注一下,下期更精彩。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。