赞
踩
1.首先,我们要明确strcpy的用法及工作原理,如下:
#include<stdio.h>
#include<string.h>(strcpy需要引的头文件)
int main()
{ char arr1[] = "#############";
char arr2[] = "bit";
strcpy(arr1,arr2) ; (strcpy (目的地,源头))
printf("%s\n",arr1);
return 0;
}
此段代码的输出结果为bit。因为字符串的结束标志为‘\0’,所以字符串arr1的内容其实为”#########\0",字符串arr2的内容为"bit\0",strcpy函数的本质就是将源头的值输送给目的地的值,遇到\0则停止。所以打印出arr1的结果是“bit”。
2.模拟实现strcpy函数
方法1:
#include<Stdio.h>
void my_strcpy(char*dest,char*sur) (地址要用指针来接收)
{
while( *sur != '\0')
{
*dest = *sur;
dest++;
sur++;
}
*dest = *sur
}
int main()
{
char arr1[] = "##########";
char arr2[] = "bit";
my_strcpy(arr1,arr2); (数组传参实际上传过去的是数组首元素地址)
printf("%s\n,arr1);
return 0;
}
如果满分给十分,那么方法1只能拿到6分,代码形式较挫且不能发现bug
方法2:
#include<Stdio.h>
void my_strcpy(char*dest,char*sur)
{
while( *dest++ = *sur++) (*dest与*sur在没遇到\0之前都为真,所以while可以运行,每运行一次,后置++就使dest与str指针指向下一个元素,直到遇到\0)
{ ;
}
*dest = *sur
}
int main()
{
char arr1[] = "##########";
char arr2[] = "bit";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
方法2只能得到7分,当将arr1或者arr2其中一个改为空指针NULL时,系统就会自动崩溃,无法自动发现bug,例如:
#include<Stdio.h>
void my_strcpy(char*dest,char*sur)
{
while( *dest++ = *sur++)
{ ;
}
*dest = *sur
}
int main()
{
char arr1[] = "##########";
char arr2[] = "bit";
my_strcpy(arr1,NULL);
printf("%s\n",arr1);
return 0;
}
此代码也有优化方法,如下:
#include<Stdio.h>
void my_strcpy(char*dest,char*sur)
{
if(dest != NULL && sur !=NULL)
{
while( *dest++ = *sur++)
{ ;
}
}
*dest = *sur
}
int main()
{
char arr1[] = "##########";
char arr2[] = "bit";
my_strcpy(arr1,NULL);
printf("%s\n",arr1);
return 0;
}
此代码虽然可以正常运行,但并不能解决问题,而是将问题跳过)
因此只能得7分
方法3:
此方法要用到的函数assert()->断言函数,头文件为(#include<assert.h>
用法如下:
#include<Stdio.h>
#include<assert.h>
void my_strcpy(char*dest,char*sur)
{
assert(dest != NULL);(断言) ()中结果若为真,则什么都不发生,若为假,则系统报错
assert(sur != NULL);(断言)
while( *dest++ = *sur++)
{ ;
}
}
int main()
{
char arr1[] = "##########";
char arr2[] = "bit";
my_strcpy(arr1,NULL);
printf("%s\n",arr1);
return 0;
}
assert()的引入让系统可以自动发现问题并报错,而不是跳过问题;(8分)
方法4:
此方法需要引入const用以修饰指针
const修饰的作用,如下:
假如 int a = 10;
int *p = &a;
*p = 20;
此段代码是将a的地址放入指针中,通过对指针的解引用来改变a的值。
但如果使用const后有以下几种情况:
1.const加在*的左边
int a = 10;
const int*p = &a
*p = 20
运行可发现此段代码是错误的,原因:
const限定了一个变量无法被改变,因此加在*号左边时,实际上const对*p产生了作用,因此*p无法被改变,代码错误。
const加在*右边
int a = 10;
int * const p = &a
*p = 20;
运行可发现此段代码可正常运行,a的结果被改为20,原因是const放在*的右边,对p产生了作用,因此对*p并无影响。但无法改变p的值
方法4如下:
#include<Stdio.h>
#include<assert.h>
char * my_strcpy(char*dest, const char*sur) (源头的数据一定不会被修改,为了保护源头的数据,因此加上const)(strcyp函数实际返回值是目的地的那个值)
{
char* = ret;(因为后面程序运行以后,目的地的地址已经不是刚开始的时候的地址了,因此在开始创建一个变量接收目的地的起始地址,后面再返回)
assert(dest != NULL);
assert(sur != NULL);
while( *dest++ = *sur++)
{ ;
}
return ret;(返回起始地址)
}
int main()
{
char arr1[] = "##########";
char arr2[] = "bit";
my_strcpy(arr1,NULL);
printf("%s\n",arr1);
return 0;
}
(10分)const和char*各一分。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。