文章目录
一,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