strlen函数,strcpy函数,strcat函数,memset函数,strcmp函数,memcpy函数,memove()函数

一,strlen函数(库函数头文件<string.h>)

具体代码的实现

#include <stdio.h>
#include<assert.h.h>
int my_strlen1(const char*p)
{
assert(p!=nullptr);
int i=0;
if(p[i]!=0)
{i++;}
return i;
}

采用指针--的方法
int my_strlen2(const char*p)
{
assert(p!=nullptr);
const char*a=p;
if(*a!='\0')
{a++;}
return a-p; 
}
int main()
{
const char p[20]={"lijianli"};
my_strlen(&p);
return 0;
}

二,strcpy函数(库函数头文件<string.h>)拷贝函数

具体代码的实现

#include<stdio.h>
#include<assert.h>
char* my_strcpy1(char *q,const char*p)
{
assert(q!=nullptr&&p!=nullptr);
int i=0;
for(i=0;p[i]!='\0';i++)
{
q[i]=p[i];
}
q[i]='\0';
return q;
}


char* my_strcpy2(char *q,const char*p)
{
assert(q!=nullptr&&p!=nullptr);
char*sc=q;
while(*p!='\0')
{
*sc=*p;
sc++;
p++;

或者这样写
*sc++=*p++;
}
*sc='\0';
return q;
}
int main()
{
const char p[20]={"lijianli"};
char q[20]={};
my_strcpy(&q,&p);
return 0;
}

三,strcat函数(头文件是<string.h>)字符串拼接

字符串拼接函数

#include<stdlib.h>
#include<assert.h>
#include<string.h>
char *my_strcat(char*a,char*b)
{
assert(a!=nullptr&&b!=nullptr);
int len=strlen(a);
strcpy(a+len,b);
return a;
}
int main()
{
char ar[20]={"lijianli"};
char br[20]={"sishuaige"};
my_strcat(ar,br);
return 0;
}

四,memset函数(头文件<string.h>)赋值为某字符

 memset(char*a,int c,unsigned long n)
 将a所指向的前n个字节全部赋值为c
#include<stdlib.h>
#include<assert.h>
void my_memset(void *p,unsigned char val,int count)
{
assert(p!=nullptr);
char*sc=(char*p);
for(int i=0;i<count;i++)
{
*sc=val;
sc++;
}
}
int main()
{
int ar[10]={};
char car[10]={};
double dar[10]={};
my_memset(ar,2,5);
my_memset(car,2,5);
my_memset(dar,2,5);
return 0;
}

五,strcmp函数(根据ASCII的值比较两个字符串的大小头文件<string.h>

#include<stdlib.h>
#include<assert.h>
int my_strcmp(const char*a,const char *b)
{
 assert(a!=nullptr&&b!=nullptr);
 while(a!='\0'&&b!='\0'&&*a==*b)
 {
  ++a;
  ++b;
 }
 return(*a-*b);
}
int main()
{
 char ar[20]={"lijianli"};
 char br[20]={"lijixnli"};
 my_strcmp(ar,br);
 return 0;
}

六,memcpy函数(头文件<string.h>)void*无类型拷贝(源的前n个拷入目的)

     memcpy(char*a,char*b,int n)
     将b指向的起始位置到第n个字节内容复制到a指向的地址首部
void *  memcpy ( void * dest,  const  void * src,  size_t  n)
{
     char *      d = ( char *) dest;
     const  char *  s = ( const  char *) src;
     while (n-)
        *d++ = *s++;
     return  dest;
}

七,memove()可处理有内存交集的区间是memcpy()的升级

memmove函数支持源缓冲区与目标缓冲区是同一块并且能够处理两者的重叠的情况。

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
此时没有叠加区域就一切正常,有叠加区域就会改变源内容,但是拷贝成功

(3)当源内存的首地址小于目标内存的首地址时
1,dest>=src+size(没有交集),实行正向向拷贝(和原地址大于目标地址放在一块执行)
2,有交集,实行反向拷贝
此时没有叠加区域一切正常,有了叠加区域就会改变源内容拷贝成功

 //Algorithm:
   void * memmove(void * dst, void * src, size_t count)
   {
               void * ret = dst;
               dest<=src完全正向;
               if (dst <= src || dst >= (src + count)) {
                       while (count--)
                               *dst++ = *src++;
                       }
               else {
                       dst += count - 1;
                       src += count - 1;
                         while (count--)
                                *dst-- = *src--;
                       }
               return(ret);
       }

八,‘0’与’\0’与’ ’

‘0’对应ASCII是48
'\0’对应的字符是(Null)ASCII值是0
‘ ’对应空格ASCII值是32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值