一.字符函数分为字符分类函数和字符转换函数。
字符分类函数:
字符转换函数:
二.内存函数
1. memcpy
内存拷贝,单个字节的拷贝,重叠空间拷贝可能出错。类似strcpy函数
void * memcpy ( void * destination, const void * source, size_t num );
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
2.memmove
内存移动,将source源头内存移动到destination目标内存。
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。如果源空间和目标空间出现重叠,就得使用memmove函数处理。
void * memcpy ( void * destination, const void * source, size_t num );
3.memcmp
比较从ptr1和ptr2指针开始的num个字。
int memcmp ( const void * ptr1,const void * ptr2,size_t num );
返回值>0,ptr1>ptr2;
==0,ptr1==ptr2;
<0,ptr1<ptr2;
三.内存函数的实现
1.memcpy
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。表明,是以每个字节单位去拷贝,所以将destination和source强转成char类型指针,解引用访问一个字节,逐渐向后拷贝。第一行用assert防止destination和source为空指针。用void*指针保存destination起始位置。
void *user_memcpy(void *dest, void *src, size_t num)
{
assert(dest && src);
void *ret = dest;
for (int i = 0; i < num; i++)
{
*((char *)dest) = *((char *)src);
dest = (char *)dest + 1;
src = (char *)src + 1;
}
return ret;
}
destination,source向后移动不推荐用++,因为强转后的destination和source是不能被赋值的变量。
2.memmove
将source源头内存移动到destination目标内存。源内存块和目标内存块是可以重叠的。
重叠部分既要拷贝出去,又要被拷贝修改。所以保证已经拷贝的重叠内存要比还未拷贝的重叠内存先被修改,而且重叠部分要最先开始拷贝。
因此分为从前往后拷贝和从前往后拷贝。依旧以字节为单位。
void *user_memmove(void *dest, void *src, size_t num)
{
assert(dest && src);
void *result = dest;
if (dest < src)
{
for (int i = 0; i < num; i++)
{
*((char *)dest + i) = *((char *)src + i);
}
}
else
{
for (int i = num - 1; i >= 0; i--)
{
*((char *)dest + i) = *((char *)src + i);
}
}
return result;
}
以上就是主要内容。