对于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 | } |