//string 系列的庫函數的實現: 字符串=字符數組+'\0';
1 char* strcpy1( char *strDest, const char *strSrc);
2 char* strncpy1(char* strdest, const char* strsrc, int n);
3 int strcmp1(const char* str1, const char* str2);
4 int strlen1(const char* str); //還可以使用遞歸的思想
5 char* strstr1(const char* str1, const char* str2);
6 char *strcat1(char *strDest, const char *strSrc);
7 void *memcpy1(void *pvTo,const void *pvFrom,size_t size); //完成內存的拷貝
========================================================================================
1 char* strcpy1( char *strDest, const char *strSrc);
char* strcpy1(char *strDest, const char *strSrc ) { assert(strSrc!=NULL&&strDest!=NULL); char *str=strDest; //while(str!='\0') while(str!=NULL) 犯得倆神棍一樣的錯誤!!! while(*strSrc!='\0') { *str++=*strSrc++; } *str='\0'; //最後加上字符串結束標志 cout<<strDest<<endl; return strDest; }
2 char* strncpy1(char* strdest, const char* strsrc, int n)
char* strncpy1(char* strdest, const char* strsrc, int n ) { assert(strdest!=NULL&&strsrc!=NULL); char* str=strdest; int num=0; while(*strsrc!='\0'&&num<n) { *str++=*strsrc++; num++; } if(num==n) { *str='\0'; cout<<"拷貝成功了:"<<strdest<<endl; return strdest; } cout<<"拷貝失敗!!!"<<endl; return NULL; }
3 int strcmp1(const char* str1, const char* str2)
// 否定:比較每一個字符的值得大小---正數返回1,相等返回0,負數返回-1; int strcmp1( const char* str1, const char* str2 ) { assert(str1!=NULL&&str2!=NULL); int res=0; //while(*s1==*s2){} res=*s1-*s2; while(!(res=(unsigned char*)*str1-(unsigned char*)*str2)&&(*str2)) { str1++; str2++; } if(res>0) { cout<<1<<endl; return 1; } else if(res<0) { cout<<-1<<endl; return -1; } cout<<0<<endl; return 0; }
4 int strlen1(const char* str)
int strlen1( const char* str ) { assert(str!=NULL); int num=0; const char *strtmp=str; //char *strtmp=str; 出錯 while(*strtmp!='\0') { num++; strtmp++; } cout<<"The number is "<<num<<endl; return num; }
5 char* strstr1(const char* str1, const char* str2)
char* strstr1( const char* str1, const char* str2 ) { assert(str1!=NULL&&str2!=NULL); //const char *p=str1,*p2=str2; char *p=(char*)str1,*p2=(char*)str2; char *tmp=NULL; //tmp從第一個匹配的字符開始標志。 while(*p!='\0') { if(*p==*p2) { tmp=p; while(*tmp==*p2&&*p2!='\0') { tmp++; p2++; } if(*p2=='\0') { cout<<"匹配:找到了"<<p<<endl; return p; } } p++; } cout<<"匹配失敗!"<<endl; return NULL; }
6 char *strcat1(char *strDest, const char *strSrc)
//1 找到strDest的最後位置 2 建立連接關系一一拷貝。 char * strcat1( char *strDest, const char *strSrc ) { /*assert(strDest!=NULL&&strSrc!=NULL); int lenDest,lenSrc; lenDest=strlen(strDest); lenstrlen(strSrc); for(int i=0;i<lenSrc;i++) { strDest[lenDest+i]=strSrc[i]; } strDest[lenDest+lenSrc]='\0'; cout<<strDest<<endl; return strDest;*/ //第二種方法: assert(strDest!=NULL&&strSrc!=NULL); char *strP=strDest; while(*strP!='\0') { strP++; } //從最後的一個位置 進行復制。 while(*strSrc!='\0') { *strP++=*strSrc++; } *strP='\0'; cout<<strDest<<endl; return strDest; }
7 void *memcpy1(void *pvTo,const void *pvFrom,size_t size); //完成內存的拷貝
注意:編譯的時候出現錯誤!!
// //內存拷貝可以 拷貝任意數據類型的數據---轉化為(byte*) //void * memcpy1( void *pvTo,const void *pvFrom,size_t size ) //{ // assert(pvTo!=NULL&&pvFrom!=NULL); // byte *memTo=(byte*)pvTo; // byte *memFrom=(byte*)pvFrom; // // while(size>0) // { // *memTo++=*memFrom++; // size--; // } // // return pvTo; //}
測試代碼:
char str1[100],str2[]="nihao haha"; //strcpy1(str1,str2); strncpy1(str1,str2,8); /*char *s1="Hello, world!"; char *s2="Hello, World!"; strcmp1(s1,s2);*/ //strlen1(str2); //在函數外面可以是:len=sizeof(str)/sizeof(char); /*char *s1="Hello, world!"; char *s2="world"; strstr1(s1,s2);*/ char string1[50]="Thanks ,thank you."; char *s="you are welcome."; strcat1(string1,s);