#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返回<0
int 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;
}