字符串操作_(不使用库函数)

 
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

原文地址:https://www.cnblogs.com/Lunais/p/5861570.html