串操作

#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;

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值