转 字符串处理函数(不使用库函数实现)

//////////////////////////////////////////////////////////////////////////////////
//计算字符串的长度
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<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<len/2;++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<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<len/2;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;
}z

时间: 2024-11-07 02:40:27

转 字符串处理函数(不使用库函数实现)的相关文章

C库函数中字符串处理函数集合(转)

C库函数中字符串处理函数集合(转) C库函数中字符串处理函数集合 bcmp 原型:extern int bcmp(const void *s1, const void *s2, int n); 用法:#include <string.h> 功能:比较字符串s1和s2的前n个字节是否相等 说明:如果s1=s2或n=0则返回零,否则返回非零值.bcmp不检查NULL. bcopy 原型:extern void bcopy(const void *src, void *dest, int n); 用

字符串处理函数总结

字符串函数(String processing function)也称为字符串处理函数,指的是编程语言中用来进行字符串处理的函数. C语言中常用的字符串函数: strcpy 原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NUL结束的字符串复制到dest所指的数组中. 返回指向dest结尾处字符(NUL)的指针. 举例: // strcpy.c #include <syslib.

几个常见字符串处理函数的实现原理

字符串是一种常见的数据结构,对字符串的处理又可以十分灵活,所以在实际开发,尤其是非数值处理中,字符串的应用非常广泛.虽然很多字符串操作都封装在了函数库里,应用程序可以直接通过调用库函数来实现字符串处理,然而对于开发者而言,若能了解其底层实现原理,对于应用编程而言还是大有裨益的. 这篇文章主要介绍几种常用的字符串处理函数的实现原理. 一.strlen函数 strlen函数:计算字符串的实际长度,不包括'\0'. 算法:从第一个字符开始扫描,直到遇见第一个'\0',停止扫描,返回字符串长度. 代码如

转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 作者:jcsu C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. 字符串求长 - strlen5. 字符串连接 - strcat6. 字符串比较 - strcmp7. 计算字符串中的元音字符个数8. 判断一个字符串是否是回文1. 写一个函数实现字符串反转 版本1 - while版 void strRev(char *s){    

windows平台没有提供的两个字符串操作函数。

在看一些开源代码时,经常看到一些字符串操作函数,这些函数在Linux平台下是有的,但在windows平台上,MS没有提供.因此在软件中不得不自己实现.常见的库函数有: //获得当前字符的一个拷贝,由外部释放内存. char *strdup(const char *src) { int len; char *dst; len = strlen(src) + 1; if ((dst = (char *) malloc(len)) == NULL) return (NULL); strcpy(dst,

一起talk C栗子吧(第七十回:C语言实例--字符串初始化函数)

各位看官们,大家好,上一回中咱们说的是字符串查找的例子,这一回咱们说的例子是:字符串初始化函数.闲话休提,言归正转.让我们一起talk C栗子吧! 在定义局部变量的时候,我们需要对字符串进行初始化操作.当然了,手动给字符串初始化是可以的,不过标准库给我们提供了专门的初始化函数:memset.下面我们来介绍它的用法. memset函数用法 memset函数的原型:void *memset(void *s, int c, size_t count) memset函数的用法:在s指向的字符串中,把前c

有意思的字符串查找函数

通过一段时间对字符串的了解,我发现了许多有意思的字符串函数,下面我们就以常见的字符串查找函数:strchr,strrchr,strstr,strrstr为例来模拟实现这些有意思的字符串查找函数. [strchr][strrchr] 查找一个字符,有所不同的是:strchr用于查找这个字符第一次出现的位置,strrchr用于查找这个字符最后一次出现的位置.下面我们就来打开MSDN来查找这两个字符查找函数的函数原型: char *strchr(const char *string,int c) ch

C/C++中常用的字符串处理函数和内存字符串函数

一.            字符处理函数 1.        字符处理函数:<ctype.h> int isdigit(int ch) ;//是否为数字,即ch是否是0-9中的字符 int isxdigit(int ch) ;//是否为十六进制数字,即ch是否是0-9 a-z A-Z 中的字符 int isalpha(int ch) ;//是否为字母 int isalnum(int ch) ;//是否为字母或数字 int islower(int ch) ;//是否为小写字母 int isupp

20140902 字符串拷贝函数 右旋转字符串 string类的编写

1.strncpy字符串拷贝函数 //strncpy的程序 #include<stdio.h> #include<assert.h> char *strncpy1(char *strDest,const char *strSrc,int n) { assert((strDest!=NULL)&&(strSrc!=NULL)&&n>0); if(strDest==strSrc) return strDest; char *Address=strD