//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);