strcpy函数
不调用C/C++库函数,编写strcpy()函数。
char * my_strcpy(char *strDest,const char *strSrc) { char *p=strDest; while(*strSrc) { *strDest++=*strSrc++; } *strDest='\0'; return p; }
虽然这个函数很容易写出来,但是在调用 my_strcpy时,常常由于内存问题,执行时报错。error1,error2,error3都是被犯过的错误。
#include<iostream> using namespace std; char * my_strcpy(char *strDest,const char *strSrc); void Display(char *p); void error1(); void error2(); void error3(); void correct1(); void correct2(); void correct3(); int main(void) { correct1(); correct2(); correct3(); getchar(); } char * my_strcpy(char *strDest,const char *strSrc) { char *p=strDest; while(*strSrc) { *strDest++=*strSrc++; } *strDest='\0'; return p; } void Display(char *p) { while(*p) { cout<<*p++; } cout<<endl; } void error1() { char *src="I Love China"; //这里的dest仅仅只是一个指针,没有分配内存,运行时报错。 char *dest; my_strcpy(dest,src); Display(dest); } void error2() { char *src="I Love China"; //还是运行报错,还是没有给dest分配内存,仅仅只是dest指针指向一个常量 char *dest="I Love Shanghai"; my_strcpy(dest,src); Display(dest); } void error3() { char src[]="123456789"; char dest[]="123"; /*dest[]数组不够长,数组越界*/ my_strcpy(dest,src); Display(dest); } void correct1() { char *src="I Love China"; //使用 new 进行动态内存分配,strlen测得的长度不包括‘\0’ char *dest=new char[strlen(src)+1]; my_strcpy(dest,src); Display(dest); delete(dest); } void correct2() { char *src="I Love China"; char *dest="I Love Shanghai"; //使用malloc 为dest分配内存 dest=(char*)malloc(strlen(src)*sizeof(char)+1); my_strcpy(dest,src); Display(dest); free(dest); } void correct3() { char src[]="123456789"; char dest[11]="123"; my_strcpy(dest,src); Display(dest); }