zoukankan      html  css  js  c++  java
  • 字符串操作_(不使用库函数)

     
    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++!='')
      len++;
     return len;
    }
    /*字符串长度较长时该方法比上面(自增两次)的效率要高 const char *temp=str;//保存src的首地址 while(*src++!='');//自增一次 return (src-temp);//返回尾部指针与头部指针之差,即长度 */

    //删除字符串中所有指定的字符

    //定义两个指针,head指针做记录使用,p做字符串遍历使用;
    char *del_char(char *str,char c)
    {
       if (str==NULL)
       {
        return NULL;
       }
      char *head = NULL;
      char *p = NULL;

      head=p=str; //首地址

      while(* p ) { //把不等于c的字符赋给源地址,跳过目标字符
       if(*p != c) {
       *str++ = *p; 
      }
        p
    ++;
    }
    *str='';
    //加上结尾符
    return head;
    }

    //从字符串指定位置开始,删除其指定长度的字符

    //首先检查pos和len的合法性,然后找到pos位置,删除len个字符
    char *delete_string(char *str,int pos,int len)
    {
     char *p=str+pos;//指向pos位置的字符  下标从0开始
     int strlen=strlen1(str);//自定义方法
     //int str_len=strlen(str);//字符长度库函数
     if ((pos < 0) || (p-str) > strlen) || (len < 0))//检查合法性
     {
        return str;
     }
     if ((p+len-str)>=strlen)//len>=pos后剩余的字符个数的话,只需对pos位置赋''
     {
        *p='';
        return str;
     }
     while( *(p+len) )  //由上面知: p+len < str + strlen; 即 p+len 小于 结束符 ''的位置
     {
        *p=*(p+len);
        p++;
     }
       *p='';
       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++);  //等号操作符返回左操作数即相等且bp不为空则循环;刚开始都不执行,src一直递增到第一个字符跟sp第一个字符一致时,当sp指向''结束
       src += 1;              //递增直到*bp ==*sp
     }
     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 != '')
     {
      while(*accpet != '')
       if(*accpet++ == *s)
        return (char *)s;
       ++s;
     }
     
     return NULL;
    }

    ////////////////////////////////////////////////////////////////////////////////

    //字符串复制
    char *strcpy1(char *Dest,const char *source)
    {
     char *srcDest=Dest;//保存目标字符串的首地址
     /*
     while( *source !='')
      *Dest++ = *source++;
     *Dest = ''; //写法1 
     */
     while((*Dest++=*source++)!='');
     return srcDest;
    }

    /////////////////////////////////////////////////////////////////////////

    //指定长度的字符串复制
    char *strncpy1(char *Dest,const char *source,int len)
    {
     char *srcDest=Dest;//保存目标字符串的首地址
     
     while( *source !='' && len--)
      *Dest++ = *source++;
     *Dest = '';
     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;
      *pvTo = '';
    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 != '')
       dest++;
     while((*dest++ = *src++) != '');
     
     return temp; 
    }

    ////////////////////////////////////////////////////////////////////////////

    ////连接两个字符串的指定个数strncat库函数的实现
    char *strncat1(char *dest, const char* src,int num)
    {
     char *temp = dest;
     while (*dest != '')
      dest++;
     while((*dest++ = *src++) != '' && num--);
     return temp;
    }

    ////////////////////////////////////////////////////////////////////////////

    //字符串的排序与交换 冒泡。。
    void sort1(char *src,int num)
    {
     int i,j;
     int tmp=0;
     for (i=0;i<num;i++)
     {
      for (j=i+1;j<num;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++ !='')
     {
      if (*ptr==' '|| *ptr=='')
      {
       end=ptr-1;//end指向单词末尾
       while(start<end)
        swap(*start++,*end--);//把单词的字母逆置
       start=end=ptr+1;//指向下一个单词的开头
      }
     }
     start=src,end=ptr-2;//start指向开头,end指向末尾
     while (start<end)
     {
      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<n;i++)
     {
      tmp[i]=head[strlen-n+i];
     }
     for (i=strlen-1;i>=n;i--)
     {
      head[i]=hean[i-n];
     }
     for (i=0;i<n;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<num;i++)
     {
      temp[i] = str[len-num+i];
     }

     //将前 len-num个字符向后移动num个字节

    for(i=0;i<len-num;i++)
     {
      str[len-1-i] = str[len-1-i-num] ;
     }
     //将保存的后num个字符放在str最前面
     for(i=0;i<num;i++)
     {
      str[i] = temp[i];
     }
     return str;
    }

     原文链接:http://blog.chinaunix.net/uid-24103300-id-108254.html

  • 相关阅读:
    一,初次接触html+css需要注意的小问题
    Pycharm如何在控制台输出窗口中使用Python解释器
    Silver Cow Party POJ
    Constructing Roads POJ
    小希的迷宫 HDU
    Wireless Network POJ
    Scanner读取记事本文件内容为空的解决办法
    mysql limit的使用方法
    Can you find it? HDU-2141 (二分查找模版题)
    【2028-07-18】精力是有限的,但智慧是无限的
  • 原文地址:https://www.cnblogs.com/Lunais/p/5861570.html
Copyright © 2011-2022 走看看