为区别库函数,函数名首字母大写。
Memcmp函数:
//内存区域内容比较函数
int Memcmp(const void *buf1,const void *buf2,unsigned int count)
{
unsigned int i=0;
while(i<count)
{
if( ((char*)buf1)[i]!= ((char*)buf2)[i] )
return ((char*)buf1)[i]-((char*)buf2)[i];
i++;
}
return 0;
}
Memcpy函数:
//内存的拷贝函数
#ifdef size_t //需要定义size_t类型
#undef size_t
#endif
#ifndef size_t
#define size_t unsigned int
#endif
extern void* Memcpy(void *dest,const void * src,size_t n)
{
unsigned int i=0;
while(i<n)
{
((char*)dest)[i]=((char*)src)[i];
i++;
}
return dest; // 返回拷贝后的内存指针
}
Memmove函数:
/*
memmove用于从src拷贝count个字符到dest,
如果目标区域和源区域有重叠的话,
memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
但复制后src内容会被更改。
但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
*/
//函数原型
#ifdef size_t //需要定义size_t类型
#undef size_t
#endif
#ifndef size_t
#define size_t unsigned int
#endif
void *Memmove( void *dest, const void *src, size_t count )
{
int i=0;
if(src==dest)
{
}
else if(((char*)src+count)>(char*)dest && (char*)src<(char*)dest) // 如果冲突
{
//从尾部循环赋值
i=count-1;
while(i>=0)
{
((char*)dest)[i]=((char*)src)[i];
i--;
}
}
else
{
while(i<count)
{
((char*)dest)[i]=((char*)src)[i];
i++;
}
}
return dest;
}
Memset函数:
//实现memset函数的功能
//内存区域初始化操作
//函数不能检查出指针越界情况 需要用户自行判断
#ifdef size_t //需要定义size_t类型
#undef size_t
#endif
#ifndef size_t
#define size_t unsigned int
#endif
void * Memset(void *s,int ch,size_t n)
{
int i=0;
while(i<n)
{
*((char*)s+i)=ch; //ch代表ascii码的整数值
i++;
}
return s;
}
Strcat函数:
//连接函数
//函数并不负责检查str1是否有足够的容量去容纳,需要用户自行判断
char * Strcat(char* str1,char* str2)
{
int n=0,p=0;
//获取下标
while(str1[n]!='\0')
{
n++;
}
while(str2[p]!='\0')
{
str1[n+p]=str2[p];
p++;
}
str1[n+p]='\0';
return str1;
}
Strcmp函数:
//比较函数
int Strcmp(const char* str1,const char* str2)
{
int i=0;
while(str1[i]&&str2[i]&&(str1[i]==str2[i])) //好方法 算法特别精简
{
i++;
}
return str1[i]-str2[i];
}
Strcpy函数:
//字符串拷贝函数
void Strcpy(char* str1,char* str2)
{
int i=0;
while(str2[i]!='\0')
{
str1[i]=str2[i];
i++;
}
str1[i]='\0';
}
Strlen函数:
//实现库函数strlen()的功能
//函数同一首字母大写 ,以区分库函数
#include<assert.h>
#ifndef NULL
#define NULL ((void*)0)
#endif
unsigned int Strlen(const char * str)
{
unsigned int length=0;
assert(str!=NULL);
while(str[length]!='\0')
{
length++;
}
return length;
}
/*---------------
递归的形式 但没有断言部分
unsigned int Strlen(const char * str)
{
if(*str=='\0')
return 0;
return 1+Strlen(str+1);
}
*/