C++笔记 | C语言strcpy函数分析与实现

对于C语言和C++的char数组而言,当给其赋值的时候必须比给的字符串多一位,因为char数组需要一位来存储/0

当这样char a[3] = { 'a','b','c' }; cout<<a;的时候会输出乱码,因为a没有位置存储/0了,同时char * a = {‘a’,’b’,’c’}这种数组的声明方法也是错误的

然后关于strcpy(char * a,const char * b)

这个函数的功能是把b里面一直到/0的部分都复制到a里面去,复制的时候当遇到/0的时候会终止,因此

char a[3] = { 'a','b','c' }; char* b; strcpy(b,a);

这种复制会出现内存错误,因为a没有末尾的/0,会导致内存溢出,同样,假如这样

char a[4] = { 'a','b','c' };char  b[3]; strcpy(b,a);

这样写也会导致内存出错,因为这个时候虽然a末尾有了/0,但是在把a复制到b里面的时候由于位置不够把/0复制到了内存里,这样就导致了内存溢出

char a[4] = { 'a','b','c' };char  * b; strcpy(b,a);

这种写法应该是正确的,但是在strcpy_s(b,a);中是错误的,某些编译器只能支持后者,可能是因为前者可能会有内存溢出,因此以后在使用strcpy(a,b)的时候尽量保证a不要是char * 类型,b是不是char *类型不重要

如果让你自己编一个strcpy,10分为满分,一下几种分值为

2

void strcpy( char *strDest, char *strSrc )

{

  while( (*strDest++ = * strSrc++) != ‘\0’ );

}

这里需要注意云算法优先级,首先*优先级高于++,因此首先执行*strDest=* strSrc,然后是++,这里需要注意的是++在没有括号的情况下直接作用于strSrc,因此左右指针都向右挪动一个位置,然后(*strDest++ = * strSrc++) 这个算式的结果为右边赋值给左边的结果,当赋值为’\0’,的时候结束

之所以可以修改是因为当指针作为形参的时候是可以修改的,不影响外面的指针

7

void strcpy( char *strDest, const char *strSrc ) 

//将源字符串加const,表明其为输入参数,加2分

{

  while( (*strDest++ = * strSrc++) != ‘\0’ );

}

以后在复写某些函数的时候记得在传入的参数前面要加上const,表明它是传入的参数

void strcpy(char *strDest, const char *strSrc) 

{

 //对源地址和目的地址加非0断言,加3分

 assert( (strDest != NULL) && (strSrc != NULL) );

 while( (*strDest++ = * strSrc++) != ‘\0’ );

}

注意这里的assert,当括号里面的参数为false的时候,会调用about()来结束程序并弹出错误,以后在书写面试题的时候记得需要在函数里面加上判断,当数据不合法的时候调用assert弹出错误能够加分,需要assert.h头文件

10分 
//为了实现链式操作,将目的地址返回,加3分! 

1

2

3

4

5

6

char * strcpy( char *strDest, const char *strSrc ) 

{

 assert( (strDest != NULL) && (strSrc != NULL) );

 char *address = strDest; 

 while( (*strDest++ = * strSrc++) != ‘\0’ ); 

 return address;

1

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值