赞
踩
在本篇博客中,我们是通过对模拟实现strcpy函数my_strcpy的不断优化进行的,最终优化代码为最后一次代码。
目录
strcpy,即string copy(字符串复制)的缩写。
strcpy函数是C/C++语言的一个标准函数 [1] ,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*,例如strcpy(arr1,arr2);即为把数组arr2的内的字符串,复制到arr1中,注意:在字符串拷贝的过程中,'\0'也会被拷贝。
- #include<stdio.h>
- int main()
- {
- char arr1[20] = "xxxxxxxxxxx";
- char arr2[] = "hello";
-
- strcpy(arr1, arr2);
- printf("%s\n", arr1);
- return 0;
- }
打开调试,在监视窗口,我们会发现strcpy在字符串拷贝时,会把'\0'拷贝过去。
我们要模拟实现strcpy函数,strcpy函数的基本原理如下图:
接下来我们就可以看图写代码了。
- #include<stdio.h>
-
- void my_strcpy(char* dest, char* src)
- {
- while (*src != '\0')
- {
- *dest = *src;
- dest++;
- src++;
- }
- *dest = *src;
- }
-
- int main()
- {
- char arr1[20] = "xxxxxxxxxxx";
- char arr2[] = "hello";
-
- /*strcpy(arr1, arr2);*/
- my_strcpy(arr1, arr2);
- printf("%s\n", arr1);
- return 0;
- }
在某些时候,我们可能将my_strcpy处的指针传错,传成空指针,这种情况如何避免呢?我们可以使用一个库函数assert,当assert(),括号中可以放一个表达式,当表达式为假时就会报错。在上面的代码我们可以对一些部分进行完善,完善后的结果是:
- #include<stdio.h>
- #include<assert.h>
-
- void my_strcpy(char* dest, char* src)
- {
- assert(dest && src);
- while (*dest++ = *src++)
- {
- ;
- }
- }
-
- int main()
- {
- char arr1[20] = "xxxxxxxxxxx";
- char arr2[] = "hello";
-
- /*strcpy(arr1, arr2);*/
- my_strcpy(arr1, arr2);
- printf("%s\n", arr1);
- return 0;
- }
我们发现在strcpy的官方解释中:
我们发现strcpy函数的参数类型和返回类型与我们设计的my_strcpy都不相同,那么为什么在strcpy函数设计初始会这样设计呢?
如果在上述代码*dest++ = *src++中,如果我们把dest和src写反了,程序会报错,那么如何避免这种问题,我们可以在*src前面加上const,这样就增加了代码的健壮性,其次在strcpy函数中返回的类型是char*类型,即函数返回的是目标空间的起始地址。下面我们按照strcpy函数尝试设计my_strcpy函数:
- #include<stdio.h>
- #include<assert.h>
-
- char* my_strcpy(char* dest, const char* src)
- {
- char* ret = dest;
- assert(dest && src);
- while (*dest++ = *src++)
- {
- ;
- }
- return ret;
- }
-
- int main()
- {
- char arr1[20] = "xxxxxxxxxxx";
- char arr2[] = "hello";
- printf("%s\n", my_strcpy(arr1, arr2));
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。