C语言字符串与内存库函数:考试复习笔记

📅 2026/8/19 9:41:34
C语言字符串与内存库函数:考试复习笔记
附图完整梳理字符分类、字符串、内存全套库函数知识体系全部函数基础用法已有完整梳理本文不再赘述。本文围绕字符串核心库函数、内存操作函数两大核心难点展开解析前者依托 ‘\0’ 结束标志讲解各类字符串函数的使用与模拟实现后者针对内存字节操作内存重叠易错实操场景逐一阐述。文章目录字符串核心库函数结合 \0 结束标志剖析strlen 使用与模拟实现strcpy 使用与模拟实现strcmp 使用与模拟实现strcat 使用与模拟实现内存操作函数依托内存字节实操场景阐释memcpy 使用与模拟实现memmove 使用与模拟实现内存重叠场景辨析字符串核心库函数结合 \0 结束标志剖析C语言字符串函数依赖 ‘\0’ 作为结束标志只适用于以空字符结尾的字符串。strlen 使用与模拟实现size_tstrlen(constchar*str)语法解读返回值size_t无符号整型代表字符计数结果参数const char * str接收字符串起始地址const保护原字符串不可被修改功能统计 \0 之前有效字符个数 \0不计入易错点遇到\0就停止不会读取数组全部空间无符号数相减容易出错| 模拟实现完整可运行代码#includestdio.h#includeassert.hsize_tmy_strlen(constchar*str){size_tcount0;while(*str!\0){count;str;}return0;}intmain(){chararr[]hello;size_tlenmy_strlen(arr);printf(%zu\n,len);return0;}strcpy 使用与模拟实现char*strcpy(char*destination,constchar*source)语法解读返回值、参数规则与strcat大体一致返回值char*返回目标空间起始地址支持链式调用参数1char * destination目标地址必须可修改参数2const char * source源字符地址const保证源数据只读功能把源字符串拷贝到目标空间连同\0一起复制易错点遇到\0停止拷贝目标空间必须足够目标内存必须可写| 模拟实现完整可运行代码#includestdio.h#includeassert.hchar*my_strcpy(char*dest,constchar*src){char*retdest;assert(destsrc);while(*src!\0){*dest*src;dest;src;}*dest*src;// \0解决了return0;}intmain(){chararr1[20]{0};chararr2[]world;my_strcpy(arr1,arr2);printf(%s\n,arr1);return0;}strcmp 使用与模拟实现intstrcmp(constchar*str1,constchar*str2)语法解读返回值int比较结果正数 / 0 / 负数参数两个入参都是const char*字符串只读不可修改功能按ASCII逐字符比较两个字符串易错点遇到\0结束比较只比较ASCII值不比较字符串长度| 模拟实现完整可运行代码#includestdio.h#includeassert.hintmy_strcmp(constchar*str1,constchar*str2){assert(str1!NULLstr2!NULL);while(*str1*str2){if(*str1\0)return0;str1;str2;}return*str1-*str2;}intmain(){chars1[]abc;chars2[]abd;intretmy_strcmp(s1,s2);printf(%d,ret);return0;}strcat 使用与模拟实现char*strcat(char*destinatin,constchar*source)语法解读返回值、参数规则与strcpy大体一致返回值char*返回目标空间起始地址支持链式调用参数1char * destination目标字符串可写必须自带\0参数2const char * source源字符串只读保护功能从destination原有\0位置向后追加source内容不覆盖前面旧数据连带\0复制易错点遇到soruce的\0停止目标空间必须足够destination必须含有结束符\0| 模拟实现完整可运行代码#includestdio.h#includeassert.hchar*my_strcat(char*dest,constchar*src){assert(dest!NULLsrc!NULL);char*retdest;//走到dest末尾的\0while(*dest!\0){dest;}//追加连带复制\0while(*dest*src){;}returnret;}intmain(){charbuf[20]hello ;charadd[]world;my_strcat(buf,add);printf(%s\n,buf);return0;}内存操作函数依托内存字节实操场景阐释内存函数直接操作原始字节不受\0约束支持任意数据类型。memcpy 使用与模拟实现void*memcpy(void*destination,constvoid*source,size_tcount)语法解读返回值void*通用指针返回目标内存起始地址参数1void * destination目标地址通用指针参数 2const void *source源内存地址源数据只读参数 3size_t count拷贝字节数量功能从源拷贝 count 个字节到目标内存。易错点不受\0影响不处理内存重叠重叠场景结果未定义| 模拟实现完整可运行代码#includestdio.h#includeassert.hvoid*my_memcpy(void*dest,void*src,size_tnum){void*retdest;assert(destsrc);while(num--){*(char*)dest*(char*)src;dest(char*)dest1;src(char*)src1;}returnret;}intmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};intszsizeof(arr1)/sizeof(arr1[0]);my_memcpy(arr12,arr1,20);for(inti0;isz;i){printf(%d ,arr1[i]);}return0;}memmove 使用与模拟实现void*memmove(void*destination,constvoid*source,size_tcount)语法解读返回值void*通用指针返回目标内存起始地址参数 1void *destination目标地址通用指针参数 2const void *source源内存地址源数据只读参数 3size_t count拷贝字节数量功能拷贝 count 字节支持内存重叠。| 模拟实现完整可运行代码#includestdio.h#includeassert.hvoid*my_memmove(void*dest,void*src,size_tnum){void*retdest;assert(destsrc);if(destsrc){//从前向后拷贝while(num--){*(char*)dest*(char*)src;dest(char*)dest1;src(char*)src1;}}else{//从后向前拷贝dest(char*)destnum-1;src(char*)srcnum-1;while(num--){*(char*)dest*(char*)src;dest(char*)dest-1;src(char*)src-1;}}returnret;}intmain(){intarr1[]{1,2,3,4,5,6,7,8,9,10};intszsizeof(arr1)/sizeof(arr1[0]);my_memmove(arr12,arr1,20);for(inti0;isz;i){printf(%d ,arr1[i]);}return0;}内存重叠场景辨析内存重叠目标区间和源区间存在部分重合。dest src从前向后拷贝memcpy、memmove都正常。dest src发生重叠只能使用memmovememcpy会覆盖还未读取的数据结果错误