☰
哪些年我忘了的字符函数02
2026/10/9 5:34:08 网站建设 项目流程

要区别开结束符'\0和空值NULL,前者用来判读字符串末尾,后者是空值

还是strstr开胃

所谓空杯应该就是扮猪吃老虎地在学一遍

不要以为学到一个知识点,整个体系的内容就都解决了

对比看我们还是没有用上assert呢

注意

1. test.c:22 return cur; 应为 return NULL;(新引入)
走到这行说明没找到,却返回了 a 的终止符位置,即空串 ""。实测:

调用方拿到非 NULL 就以为找到了,无法区分"没找到"和"找到空串"。
2. test.c:11 内层循环缺终止符保护 → 越界读、实测崩溃
while(*s1 == *s2) 在子串整体匹配到末尾时,会把 '\0' == '\0' 也当成相等,于是 s1、s2 一起越过分隔符继续自增,跑到两个缓冲区之外。实测 my_strstr("ab", "ab") → 0xC0000005 访问违例崩溃。应为 while(*s1 == *s2 && *s2 != '\0'),先排除 s2 已到末尾的情况。

3.数组不能直接数组化,改用指针

4.是比字符哦,而不是比地址

5.const的修饰的参数,最后要消去就强转,如开始的const char* str1 给了 const char* cur ,返回时时return (char*) cur;

strncpy

使用size_t这个类型是要引入stdlib.h这个库的

我们一开始存一个dest,是为了返回值的时候用上的

这里的num,在循环里的判断条件是num>0,同时有&&*src!='\0'

++*dest = ++*src , 在这里,++*dest 是一个计算出的值,被称为右值,赋值符的左边只能放可以修改的值,即使一个指向内存的变量,即左值

*dest++ = *src++, 在这里, *dest++ 就被称为左值

注意前缀符和后缀符的优先级不是平级的,除了优先级是还要考虑结合性的

怎么样的还要看规则,还有后缀使用的规则哦,它会的是先使用旧值,能这样是它自己存了份,

哈哈我补一个:dest[1]和*(dest+1)是同一用途的两种不同用法,前者是贴合数组,后者贴合指针底层。

memcpy

这里的特别之处在于,使用了泛型哦,即void*修饰的数据类型;还有的话这次我们的代码风格是大写,即帕斯卡风格,相对的是小写+下划线的风格,即下划线风格;这里的count的类型是size_t,我们也换了个名字叫size

void* MyMemcpy(void* dest, const void* src, size_t size) { unsigned char* d = (unsigned char*)dest; unsigned char* s = (unsigned char*)src; int index = 0; while (size--) *(d++) = *(s++); return dest; }

MyMemmove

void* my_memmove(void* dest, const void* src, size_t n) { unsigned char* d = (unsigned char*)dest; const unsigned char* s = (const unsigned char*)src; /* 同一块地址或无需拷贝,直接返回 */ if (d == s || n == 0) return dest; if (d < s) { /* * dest 在 src 的左边(低地址),从前向后拷贝是安全的: * src : [ - - - - - - - ] * dest: [ - - - - - - - ] * 写 dest[i] 时,src[i] 还没被覆盖。 */ for (size_t i = 0; i < n; ++i) d[i] = s[i]; } else { /* * dest 在 src 的右边(高地址),必须从后向前拷贝: * src : [ - - - - - - - ] * dest: [ - - - - - - - ] * 若从前向后,dest[0]=src[0] 会破坏后面还要读的 src 数据。 */ for (size_t i = n; i != 0; --i) d[i - 1] = s[i - 1]; } return dest; }

其他的MyStrlen、MyStrcpy、MyStrcat就是洒水啦

在这里额外感受一下 这里的mystrcpy有个高级写法就好

还有mystrcmp的时候注意组合一下情况

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询