常见字符串操作的内部实现:(默认传入的地址不是NULL,否则直接return NULL)
名称:memset
功能:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
void* memset(void* s, int c, size_t count)
{
char* xs = (char*)s;//创建临时指针变量指向开辟内存空间首地址
while(count--)//循环count次完成操作
{
*xs++ = c;//将内存值赋值为c,并实现++
}
return s;//完成操作后返回开辟的内存首地址
}
名称:memcpy
功能:函数用于 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域)。
void* memcpy(void* dest, void* src, size_t count)
{
char* tmp = (char*)dest; //创建临时指针变量指向dest内存首地址
const char* src1 = (char*)src;//创建const指针变量指向src内存首地址(const防止指针操作改变src中的数据)
while(count--)
{
*tmp++ = *src1++;
}
return dest;
}
名称:memmove(区别memcpy是dest和src可以重叠)
功能:由src所指内存区域复制count个字节到dest所指内存区域。
src和dest所指内存区域可以重叠,但复制后dest内容会被更改。函数返回指向dest的指针。
需要注意的操作:
//(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
//(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝
//(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝
void* memmove(void* dest, void* src, size_t count)
{
if(dest == src)
{
return dest;
}
char* tmp;
const char* s;
if(dest <= src)
{
tmp = (char*)dest;
s = (const char*)src;
while(count--)
{
*tmp++ = *s++;
}
}
else
{
tmp = (char*)dest;
tmp += count;
s = (const char*)src;
s += count;
while(count--)
{
*--tmp = *--s;
}
//或者
tmp = (char*)dest;
tmp += count -1;
s = (const char*)src;
s += count -1;
while(count--)
{
*tmp-- = *s--;
}
} return dest;
}
名称:memcmp
功能:memcmp是比较内存区域buf1和buf2的前count个字节。该函数是按字节比较的。
int memcmp(void* buff0, void* buff1, size_t count)
{
int ret = 0;
const unsigned char* tmp0 = (const unsigned char*)buff0;
const unsigned char* tmp1 = (const unsigned char*)buff1;
for(;count > 0; ++tmp0, ++tmp1, count--)
{
ret = *tmp0 - *tmp1;
if(ret != 0)
{
break;
}
}
return ret;
}
int memcmp(void* buff0, void* buff1, size_t count)
{
int ret = 0;
const unsigned char* tmp0 = (const unsigned char*)buff0;
const unsigned char* tmp1 = (const unsigned char*)buff1;
for(;count > 0; ++tmp0, ++tmp1, count--)
{
ret = *tmp0 - *tmp1;
if(ret != 0)
{
break;
}
}
return ret;
}