#include <stdio.h>#include <string.h>#include <malloc.h>#include<assert.h>//测串长int StrLength(const char *str) { assert(str); const char*p = str; while(*p++); return p-str-1; } //比较两个串的大小.若str1>str2返回>0,str1==str2返回=0,st1<str2返回<0int StrCompare( const char* s, const char * t){ const char* p1=s; const char* p2=t; while(*p1 && *p2){ if(*p1 != *p2) return *p1-*p2; p1++; p2++; } return StrLength(s)-StrLength(t);}//字符串拷贝char * StrCopy(char * strDest, const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) throw "Invalid argument(s)"; char * strDestCopy=strDest; while ((*strDest++=*strSrc++)!='/0'); return strDestCopy; }char * StrCopyImprove(char * strDest, const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) throw "Invalid argument(s)"; int lens=StrLength(strSrc),lend=StrLength(strDest),i; if (lend<lens) { char *temp = new char[lens+1]; while ((*temp++=*strSrc++)!='/0'); for(i=0;i<lens+1;i++) temp--; return temp; } else { return StrCopy(strDest,strSrc); }}//字符串连接char *StrConnect(char * s,char * t) { assert(s!=NULL && t!=NULL); int lenST=StrLength(s)+StrLength(t)+1; char *temp= (char*)malloc(lenST*sizeof(char)); assert(temp!=NULL); char *sp = s,*tp=t; while(*sp) *temp++=*sp++; while(*temp++=*tp++); while(lenST--)temp--; return temp;}//求子串:从主串的pos位置开始(pos从0开始计数),取长度为len的子串.char *SubString(char *s, int pos,int len){ assert(s!=NULL); int lens=StrLength(s),i=len; if(pos<1 || pos>lens || len<0 || len>lens-pos+1) throw"Valid parameters" ; char *sub=NULL; if(!len) return sub; sub=(char*)malloc((len+1)*sizeof(char)); char *sp=s; while(pos--) sp++; while(len--){ *sub=*sp; sub++; sp++; } *sub='/0'; while(i--) sub--; return sub;}//模式匹配(算法思想:从主串S的第pos个字符起和模式T的第一个字符比较之,若相等,则继续逐个比较后续//字符,否则从主串的下一个字符起再重新和模式T的字符比较之。int StrMatch(char* S,char* T,int pos){ int lenS = StrLength(S); int lenT =StrLength(T); int i=pos,j=0; while(i<lenS && j<lenT){ if(*(S+i)==*(T+j)){ ++i; ++j; } else{ i=i-j+1; j=0; } } if(j>=lenT) return i-lenT; else return -1;}
串拷贝(strcpy)和内存拷贝(memcpy)的区别:
strcpy()只能拷贝字符串,memcpy()可以拷贝任意类型的数据.
memcpy()的模拟如下:
void * memcpy(char *pvTo, char * pvFrom, size_t size){
assert((pvTo!=NULL)&&(pvFrom!=NULL));
char *pbTo=pvTo; //防止改变pvTo的地址
char * pbFrom=pvFrom;//防止改变pvFrom的地址
while(size-->0){ *pbTo++=*pbFrom++;}
return pvTo;
}