自己实现的C语言string.h 头文件的字符串函数与几个内存操作函数

 

#include<stdio.h>

char* strcpy(char* dest,const char* src);  //字符串拷贝
char* strcat(char* dest,const char* src);  //字符串连接,返回dest字符串
char* strncat(char* dest, const char* src, int size);//把src前n个字符串连接到dest,返回dest字符串
int   strcmp(const char* src1,const char* src2);  //字符串比较  返回值: 1:> 0:= -1<
int   strncmp(const char* src,const char* dst,int size);  //dst前n个字符和src比较返回值: 1:>  0:=  -1<
int   strlen(const char* src);  //返回字符串长度
char* strchr(const char* src, int ch); //字符ch在字符串第一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针
char* strrchr(const char* src, int ch); //字符ch在字符串最后一次出现的位置,返回出现字符ch位置开始到字符串结束位置的指针
char* strstr(const char* src, const char* sub); //字符串sub在字符串第一次出现的位置,返回出现字符串sub位置开始到字符串结束位置的指针

//memery copy operate function==================//
void* memcpy(void* dest,const void* src,unsigned int size); //把src的内容拷到dest内存里去,并返回dest指向的内存地址
void* memset(void* dst, int ch, unsigned int size); //把dst内存中的size大小用使用ch来初始化,并返回dest指向的内存地址
int   memcmp(const void* src1, const void* src2, unsigned int size); //比较内存中src1与src2中的前size 个字符是否相等,1:>  0:=  -1<  (see strncmp(const char*,const char*,unsigned int))
void* memchr(const void* dst, int ch, unsigned int size); //在内存中的某一范围内,查找特定的字符ch,并返回指向ch的指针
void* memmove(void* dst, const void* src, unsigned int size); //memmove()与memcpy()一样都是用来拷贝src所指的内存内容前n个字节到dest所指的地址上。不同的是,当src和dest所指的内存区域重叠时,memmove()仍然可以正确的处理,不过执行效率上会比使用memcpy()略慢些.返回指向dest的指针

//memery copy operate function==================//


int main()
{
// printf("the string len=%d/n",strlen("helloWorld")); 


// char dest[20];
// printf("the string is=%s/n",strcpy(dest,"helloWorld"));

// char dest[30]="hello--";
// printf("after connect sub string is=%s/n",strcat(dest,"world"));

// char dest[30]="hello--";
// printf("after connect sub string is=%s/n",strncat(dest,"world_programe",4));
 
// printf("the string compare result is=%d/n",strcmp("hello","aello"));

// printf("the string compare result is=%d/n",strncmp("hello","hello_good",5));

// printf("the char appear position is=%s/n",strchr("hello-r-es-d",'-'));

// printf("the char appear position is=%s/n",strrchr("hel*lo-r*-e*s-d",'*'));
 
// printf("the sub string is=%s/n",strstr("hello_world","lo"));

 char dest[20];
// printf("the sub string is=%s/n",memcpy(dest,"hello..111",sizeof(dest)));
 printf("the sub string is=%s/n",memset(dest,'0',sizeof(dest)));


 return 0;
}

//=========================================================//

int  strlen(const char* src)
{
 const char* p=src;
 while(*p++!='/0');
 return p-src-1;
}

//=========================================================//
char* strcpy(char* dest,const char* src)
{
 if(dest&&src)
 {
  int i=0;
  while((*(dest+i)=*(src+i))!='/0') i++;
  *(dest+i)='/0';
 // return dest;
 }
 return dest;
}

//=========================================================//
char* strcat(char* dest,const char* src)
{
 if(dest&&src)
 {
  int len=strlen(dest);
 // printf("len=%d/n",len);
  int i=0;
  while((*(dest+len+i)=*(src+i))!='/0') i++;
  *(dest+len+i)='/0';
 }
 return dest;
}

//=========================================================//
char* strncat(char* dest, const char* src, int size)
{
 if(dest&&src)
 {
  int len=strlen(dest); 
  int i=0;
  while((i<size)&&((*(dest+len+i)=*(src+i))!='/0')) i++;   
 }
 return dest;
}

//=========================================================//
int strcmp(const char* src1,const char* src2)
{
 int equal;
 int i=0;
 while(!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))
  i++;
 if(equal<0) return -1;
 else if(equal>0) return 1;
 else return 0;
}

//=================比较两个字符串前size 个字符串是否相等==========================//
int strncmp(const char* src1,const char* src2,int size)
{
 int equal;
 int i=0;
 while((i<size)&&!(equal=*(unsigned char*)(src1+i)-*(unsigned char*)(src2+i))&&(*(src1+i))&&(*(src2+i)))
  i++;
 if(equal<0) return -1;
 else if(equal>0) return 1;
 else return 0;
}

//=========================================================//
char* strchr(const char* src, int ch)
{
 int i=0;
 while(*(src+i)&&(*(src+i)!=ch)) i++;
 return (char*)(src+i);
}

//=========================================================//
char* strrchr(const char* src, int ch)
{
 int len=strlen(src);
 int i=0;
 while(i<len&&(*(src+len-i)!=ch)) i++;
 return (char*)(src+(len-i));
}

//=========================================================//
char* strstr(const char* src, const char* sub)
{
 if(src&&sub)
 {
  int subLen=strlen(sub);
  int srcLen=strlen(src);
  int nomatch=1;
  int fds=srcLen-subLen+1;
  int i=0;
  if(fds>0) //find counts in the string
   while((nomatch=strncmp(src+i,sub,subLen))&&fds--)//把当前src的指针往后推,直到找到与sub指针相同为止
    i++;
  if(nomatch)
   return 0;
  else
   return (char*)(src+i);
 }
 return 0;
}

//====================memory operate=====================================//
//====================memory operate=====================================//
void* memcpy(void* dest,const void* src,unsigned int size)
{
 if(dest&&src&&size>0)
 {
  int i=0;
     unsigned char* p=(unsigned char*)dest;
  unsigned char* q=(unsigned char*)src;
  while((i<size)&&(*(p+i)=*(q+i)))
   i++;
  return dest;
 } 
 return 0;
}

//=========================================================//
void* memset(void* dst, int ch, unsigned int size)
{
 int i=0;
 unsigned char* p=(unsigned char*)dst;
 while((i<size)&&(*(p+i)=ch))
  i++;
 return dst;
}

//=========================================================//
int  memcmp(const void* src1, const void* src2, unsigned int size)
{

}

//=========================================================//
void* memchr(const void* dst, int ch, unsigned int size)
{

}

void* memmove(void* dst, const void* src, unsigned int count)
{
   void * ret = dst;
   if (dst <= src || (char *)dst >= ((char *)src + count))
   {
      while (count--)
      {
        *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
   }
   else
   {
      dst = (char *)dst + count - 1;
      src = (char *)src + count - 1;
      while (count--)
      {
        *(char *)dst = *(char *)src;
        dst = (char *)dst - 1;
        src = (char *)src - 1;
      }
   }

   return(ret);


}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值