string相关函数的实现
1. strstr函数:char* strstr(const char* src,const char* dest),返回子串dest第一次在src中出现的位置。
1 char* mystrstr(const char* src,const char* des) 2 { 3 assert(src && des); 4 int n=0; 5 if (*des=='\0') 6 { 7 return const_cast<char* >(src); 8 } 9 while (*src!='\0') 10 { 11 for (n=0;*(src+n)==*(des+n);n++) 12 { 13 if (*(des+n+1)=='\0') 14 { 15 return const_cast<char*>(src); 16 } 17 } 18 src++; 19 } 20 return NULL; 21 }
2. strcmp函数:int strcmp(const char* s1,const char* s2),按字典序进行大小判断
s1>s2,返回1
s1=s2,返回0
s1<s2,返回-1
代码:
1 int mystrcmp(const char* s1,const char* s2) 2 { 3 assert(s1&&s2); 4 int ret=0; 5 while (*s1!='\0'&&*s2!='\0') 6 { 7 ret=*s1-*s2; 8 if (ret>0) 9 { 10 return 1; 11 } 12 else if (ret<0) 13 { 14 return -1; 15 } 16 else 17 { 18 s1++; 19 s2++; 20 } 21 } 22 if (*s1=='\0' && *s2=='\0') 23 { 24 return 0; 25 } 26 else if (*s1!='\0' && *s2=='\0') 27 { 28 return 1; 29 } 30 else 31 return -1; 32 }
3. strncmp函数:int strncmp(const char* s1,const char* s2,int n),比较s1和s2的前n个字符
1 int mystrncmp(const char* s1,const char* s2,int n) 2 { 3 assert(s1 && s2 && n>0); 4 int tmp=1; 5 int ret=0; 6 while (*s1!='\0' && *s2!='\0' && tmp<=n) 7 { 8 ret=*s1-*s2; 9 if (ret>0) 10 { 11 return 1; 12 } 13 else if (ret<0) 14 { 15 return -1; 16 } 17 else 18 { 19 s1++; 20 s2++; 21 tmp++; 22 } 23 } 24 if (tmp>n) 25 { 26 return 0; 27 } 28 else 29 { 30 if (*s1=='\0' && *s2=='\0') 31 { 32 return 0; 33 } 34 else if (*s1!='\0' && *s2=='\0') 35 { 36 return 1; 37 } 38 else 39 return -1; 40 } 41 }
4. strcpy函数 char* strcpy(char* dest,const char* src),将src中的字符拷贝到dest中,前提是是dest不能是const char* 并且要有足够的空间装载src中的字符。
1 char* mystrcpy(char* dest,const char* src) 2 { 3 assert(dest && src); 4 char* tmp=dest; 5 while ((*dest++=*src++)!='\0'); 6 return tmp; 7 8 }
如果像下面这样调用是不行的:
char* s1="wer";
char* s2="your"
mystrcpy(s1,s2);
最初想法是将s2内容拷贝到s1中,但是C++默认char* 是常量字符串,即s1是常量不能被改变。正确的使用方法是:
char* s1="I love you!";
char s2[20];
cout<<mystrcpy(s2,s1)<<endl;
或者:
char* s1="I love you!";
char* s3=new char[strlen(s1)+1];
cout<<mystrcpy(s3,s1)<<endl;
5. strncpy函数:char* strncpy(char* dest,cosnt char* src,int n),拷贝src的前n个字符到dest中,dest必须有足够的内存来存储src的前n个字符。用法和strcpy基本相同,也是不安全的,因为没有检查dest是否有足够的空间。一般的使用方式将n置为dest串的长度,并且保证dest的长度大于src的长度。