自定義字符串處理函數

 字符串處理函數(不使用庫函數實現) 
分類: C/C++
int strlen1(const char *str);
char *del_char(char *str,char c);
char *delete_string(char *str,int pos,int len);
const char *strstr1(const char *src,const char *sub);
char *strchr1( char *str, char ch );
int chrcnt1(const char *src,char ch);
char *strpbk(char const *s,char const *accpet);
char *strcpy1(char *Dest,const char *source);
char *strncpy1(char *Dest,const char *source,int len);
void *memcpy1(void* dst,const void* src,size_t count);
void *memmove1(void* dst,const void* src,size_t count);
char *strcat1(char *dest,const char *src);
char *strncat1(char *dest, const char* src,int num);
void sort1(char *src,int num);
char *strrv1(const char *str);
char *strrv2(const char *str);
char *strrv3(char *str,int len);
void revstr(char *src);
int isRevstr(char *str);//判斷是否爲迴文level
void loopMove(char *src,int n);
char *loopmove(char *str, int num);

//////////////////////////////////////////////////////////////////////////////////
//計算字符串的長度
int strlen1(const char *str)
{
 int len=0;
 while (*str++!='\0')
  len++;
 return len;
 /*字符串長度較長時該方法比上面(自增兩次)的效率要高
 **const char *temp=str;//保存src的首地址
 **while(*src++!='\0');//自增一次
 **return (src-temp-1);//返回尾部指針與頭部指針之差,即長度
 */
}
////////////////////////////////////////////////////////////////////////////////
//刪除字符串中全部指定的字符
//定義兩個指針,head指針作記錄使用,p作字符串遍歷使用;
char *del_char(char *str,char c)
{
 char *head=NULL;
 char *p=NULL;
 if (str==NULL)
 {
  return NULL;
 }
 head=p=str;
 while(*p)
 {
  if(*p!=c)
  {
   *str++=*p;   
  }
  p++;
 }
 *str='\0';
 return head;
}
//////////////////////////////////////////////////////////////////////////////
//從字符串指定位置開始,刪除其指定長度的字符
//首先檢查pos和len的合法性,而後找到pos位置,刪除len個字符
char *delete_string(char *str,int pos,int len)
{
 char *p=str+pos-1;//指向pos位置的字符
 int strlen=strlen1(str);//自定義方法
 //int str_len=strlen(str);//字符長度庫函數
 if ((pos<1)||(p-str)>strlen)//檢查pos是否不大於1,或pos超出字符串長度
 {
  return str;
 }
 if ((p+len-str)>strlen)//len大於pos後剩餘的字符個數的話,只需對pos位置賦'\0'
 {
  *p='\0';
  return str;
 }
 while (*p && *(p+len))//len小於或等於pos後剩餘的字符個數刪除len個字符
 {
  *p=*(p+len);
  p++;
 }
 *p='\0';
 return str;
}
///////////////////////////////////////////////////////////////////////////////
//字符串中字串的查找strstr庫函數的實現
const char *strstr1(const char *src,const char *sub)
{
 const char *bp;
 const char *sp;
 if (src==NULL || sub==NULL)//檢查src和sub的有效性
 {
  return src;
 }
 while (*src)
 {
  bp=src;
  sp=sub;
  do 
  {    //遍歷sub字符串
   if(!*sp) //若是到了sub字符串結束位置,退出
    return src;
  } while (*bp++==*sp++);
  src+=1;
 }
 return NULL;
}
/////////////////////////////////////////////////////////////////////////////
//strchr()函數返回一個指向str中ch首次出現的位置,當沒有在str中找ch時返回NULL。
char *strchr1(char *src, char ch )
{
 while((*src!=ch)&&(*src))
 src++;
 return (src);
}
////////////////////////////////////////////////////////////////////////////////
//chrcnt(), 計算某個字符在字符串中出現的次數.
int chrcnt1(const char *src,char ch)
{
 int count=0;
 while(*src)
  if(*src==ch)
   count++;
 return count;
}
/////////////////////////////////////////////////////////////////////////
//該函數返回一個指向str中第一個匹配的group中任何一個字符的字符位置.若無則返回空(NULL).
char *strpbk(char const *s,char const *accpet)
{
 while(*s != '\0')
 {
  while(*accpet != '\0')
   if(*accpet++ == *s)
    return (char *)s;
   ++s;
 }
 
 return NULL;
}
////////////////////////////////////////////////////////////////////////////////
//字符串複製
char *strcpy1(char *Dest,const char *source)
{
 char *srcDest=Dest;//保存目標字符串的首地址
 /*
 while( *source !='\0')
  *Dest++ = *source++;
 *Dest = '\0'; //寫法1 
 */
 while((*Dest++=*source++)!='\0');
 return srcDest;
}
/////////////////////////////////////////////////////////////////////////
//指定長度的字符串複製
char *strncpy1(char *Dest,const char *source,int len)
{
 char *srcDest=Dest;//保存目標字符串的首地址
 
 while( *source !='\0' && len--)
  *Dest++ = *source++;
 *Dest = '\0';
 return srcDest;
}
////////////////////////////////////////////////////////////////////////////
//內存複製的實現拷貝不重疊的內存塊
void* memcpy1(void* dst,const void* src,size_t count)    
{   
    char* pbTo = (char*)dst;    
    char* pbFrom = (char*)src;    
    assert(dst!= NULL && src != NULL);//不能存在空指針   
    assert(pbTo >= pbFrom+count || pbFrom >= pbTo + count);//防止內存重疊(overlap)    
    while (count-- > 0)    
    {    
        *pbTo++ = *pbFrom++;    
    }    
    return dst;    
}  
//////////////////////////////////////////////////////////////////////////
//memmove實現移動一塊字節,src源數據能夠不保留
  
void* memmove1(void* dst,const void* src,size_t count)    
{      
    char* pbTo = (char*)dst;    
    char* pbFrom = (char*)src;    
    assert(dst != NULL && src != NULL);//不能存在空指針   
    if (dst <= src || pbTo >= pbFrom + count)//沒有overlap的狀況,直接拷貝    
    {    
        while (count-- > 0)    
        {    
            *pbTo++ = *pbFrom++;    
        }    
    }    
    else    
    {    
        pbTo = pbTo + count -1;//overlap的狀況,從高位地址向低位拷貝    
        pbFrom = pbFrom + count -1;    
        while (count-- > 0)    
        {    
            *pbTo-- = *pbFrom--;    
        }    
    }    
    return dst;    
}   
/////////////////////////////////////////////////////////////////
//memset:把buffer所指內存區域的前count個字節設置成字符c
void * Memset(void* buffer, int c, int count)
{
   char* pvTo=(char*)buffer;
   assert(buffer != NULL);
   while(count-->0)
    *pvTo++=(char)c;
   return buffer;
}
/////////////////////////////////////////////////////////////////////////////
//字符串比較strcmp庫函數的實現
int strcmp1(const char *src,const char *dst)
{
 int ret;
 while (!(ret=*(unsigned char *)src-*(unsigned char *)dst)&& *dst)//循環比較兩個字符是否相等
 {
  ++src;
  ++dst;
 }
 if(ret<0) ret=-1;
 else
 if(ret>0) ret=1;
 
 return (ret);
}
/////////////////////////////////////////////////////////////////////////
//鏈接兩個字符串strcat庫函數的實現
char *strcat1(char *dest,const char *src)
{
 char *temp = dest;
 while (*dest != '\0')
   dest++;
 while((*dest++ = *src++) != '\0');
 
 return temp; 
}
////////////////////////////////////////////////////////////////////////////
////鏈接兩個字符串的指定個數strncat庫函數的實現
char *strncat1(char *dest, const char* src,int num)
{
 char *temp = dest;
 while (*dest != '\0')
  dest++;
 while((*dest++ = *src++) != '\0' && num--);
 return temp;
}
////////////////////////////////////////////////////////////////////////////
//字符串的排序與交換 冒泡。。
void sort1(char *src,int num)
{
 int i,j;
 int tmp=0;
 for (i=0;i {
  for (j=i+1;j  {
   tmp=src[i];
   src[i]=src[j];
   src[j]=tmp;
  }
 }
}
//////////////////////////////////////////////////////////////////////////
//字符串的反轉
char *strrv1(const char *str)
{
 int i;
 int len=strlen(str);
 char c;
 char *tmp=new char[len+1];
 strcpy(tmp,str);
 for(i=0;i {
  c=tmp[i];
  tmp[i]=tmp[len-i-1];
  tmp[len-i-1]=c;
 }
 return tmp;
}
//指針實現
char *strrv2(const char *str)
{
 char c;
 char *tmp=new char[strlen(str)+1];
 strcpy(tmp,str);
 char *ret=tmp;
 char *p=tmp+strlen(str)-1;
 while (p>tmp)
 {
  c=*tmp;
  *tmp=*p;
  *p=c;
  --p;
  ++tmp;
 }
 
 return ret;
}
//遞歸實現
char *strrv3(char *str,int len)
{
 if (len<=1)
  return str;
 char t=*str;
 *str=*(str+len-1);
 *(str+len-1)=t;
 return (strrv3(str+1,len-2)-1);
}
///////////////////////////////////////////////////////////////////////
//反轉abcdefgh 但不改變單詞的內部結構
void revstr(char *src)
{
 char *start=src,*end=src,*ptr=src;
 while (*ptr++ !='\0')
 {
  if (*ptr==' '|| *ptr=='\0')
  {
   end=ptr-1;//end指向單詞末尾
   while(start    swap(*start++,*end--);//把單詞的字母逆置
   start=end=ptr+1;//指向下一個單詞的開頭
  }
 }
 start=src,end=ptr-2;//start指向開頭,end指向末尾
 while (start {
  swap(*start++,*end--);//把整個字符串逆置
 }
}
//////////////////////////////////////////////////////////////////////
//判斷是否爲迴文level
int isRevstr(char *str)
{
 int i,len;
 int found=1;
 if (str==NULL)
 {
  return -1;
 }
 len=strlen(str);
 for (i=0;i {
  if(*(str+i)!=*(str+len-i-1))
  {
   found=0;
   break;
  }
 }
 return found;
}
/////////////////////////////////////////////////////////////////////////
//字符串循環右移
void loopMove(char *src,int n)
{
 int i=0;
 char *tmp=NULL;
 int strlen=0;
 char *head=src;
 
 while (*src++)
 strlen=src-head-1;
 n=n%strlen;
 tmp=(char*)malloc(n);
 for (i=strlen-1;i {
  tmp[i]=head[strlen-n+i];
 }
 for (i=strlen-1;i>=n;i--)
 {
  head[i]=hean[i-n];
 }
 for (i=0;i {
  head[i]=tmp[i];
 }
 free(tmp);
}
////////////////////////////////////////////////////////////////////////
//字符串右移 (不使用庫函數實現)
char *loopmove(char *str, int num)
{
 char temp[100]="";
 int i = 0; 
 int len = 0;    
 //求長度
 for(i=0;str[i]!=0;i++)
  len++;
 
 //保存最後num個字符
 for(i=0;i {
  temp[i] = str[len-num+i];
 }
 
 //將前 len-num個字符向後移動num個字節
 for(i=0;i {
  str[len-1-i] = str[len-1-i-num] ;
 }
 //將保存的後num個字符放在str最前面
 for(i=0;i {
  str[i] = temp[i];
 }
 return str;
}
相關文章
相關標籤/搜索