c语言库函数实现,c语言一些库函数实现

本文详细解析了C语言中的strstr函数实现,包括处理字符串查找的情况以及不使用strlen函数的版本。同时,介绍了my_strcpy函数用于字符串复制,并探讨了内存操作函数memmove的原理,特别是如何处理内存重叠区域。最后,讨论了memset的基本用法和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 在s1中查找s2, 如果s2的长度为0则直接返回s1*/

char *strstr(const char *s1, const char *s2)

{

size_t len;

if((len = strlen(s2)) == 0)

return (char*)s2;

for(;*s1;s1++) {

if(*s1 == *s2 && strncmp(s1, s2, len))

return (char*)s2;

}

return NULL;

}

/*和上面的功能一样,只不过没有使用strlen这个库函数*/

char *strstr(const char *s1, const char *s2)

{

int n; /*写成 size_t 更好*/

if (*s2)

{

while (*s1)

{

for (n=0; *(s1 + n) == *(s2 + n); n++)

{

if (!*(s2 + n + 1))

return (char *)s1;

}

s1++;

}

return NULL;

}

else

return (char *)s1;

}

char *my_strcpy(char *dst,const char *src)

{

assert(dst != NULL);

assert(src != NULL);

char *ret = dst;

while((* dst++ = * src++) != '\0')

;

return ret;

}只需注意到 参数不为空, 返回 dst, 一个经典写法: *dst++ = *src++;

memset函数的原型要注意,考试时千万不能把原型忘了

#include

void *memset ( void *dest , int c , size_t n );从dest开始的n个字节,每个字节设置的值为c, 一般用法为 memset(buf, 0, buf_len)

memmove函数考虑到内存的重叠区域,但理解起来总有困难,下面一种讲解很到位。

如果区域重叠,我们要保证 没有被拷贝的 src 的区域保持不变。

df5dc31e1d8414e6606ed1cc9ca231b9.png

void * my_memcpy(void *dst,const void *src,unsigned int count)

{

assert(dst);

assert(src);

void * ret = dst;

if (dst <= src || (char *)dst >= ((char *)src + count))//对应于2,3,4情况

{

while(count--)

{

*(char *)dst = *(char *)src;

dst = (char *)dst + 1;

src = (char *)src + 1;

}

}

else//对应于1情况

{

dst = (char *)dst + count - 1;

src = (char *)src + count - 1;

while(count--)

{

*(char *)dst = *(char *)src;

dst = (char *)dst - 1;

src = (char *)src - 1;

}

}

return ret;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值