2026/1/11 2:38:41
网站建设
项目流程
免费的企业网站,肥城市网站建设,没有备案的网站怎么做淘宝客,高端网站设计企业网站建设对于刚接触 C 语言的小伙伴来说#xff0c;字符串函数就像 “字符处理的万能工具”#xff0c;但用不好也容易踩坑。这篇内容会从 “核心逻辑→常用函数→避坑指南” 一步步讲#xff0c;先懂底层、再学用法、最后避坑#xff0c;保证通俗易懂#xff5e;
一、先搞懂字符串函数就像 “字符处理的万能工具”但用不好也容易踩坑。这篇内容会从 “核心逻辑→常用函数→避坑指南” 一步步讲先懂底层、再学用法、最后避坑保证通俗易懂一、先搞懂字符串的 “灵魂”——\0所有字符串函数的底层都围绕\0字符串结束符工作这是最核心的基础先把这个吃透后面的函数就好理解了1.\0是 ASCII 码值为 0 的字符是 C 语言识别 “字符串结束” 的唯一标志2.比如hello实际在内存中是h e l l o \0少了\0程序就不知道在哪停止会出现乱码、越界等问题3.定义字符数组时一定要给\0留位置比如存 5 个字符的字符串数组至少定义成char str[6]。二、基础工具类函数测长度、拷贝、拼接、比较这四类是最常用的 “基础款”先学无长度限制的版本再学更安全的带长度限制版本循序渐进一strlen给字符串 “量长度”1. 核心作用统计字符串中有效字符的个数不包含 \0比如hello的长度是 5。2. 代码演示#include stdio.h #include string.h int main() { char str[] C语言真有趣; size_t len strlen(str); // 注意返回值是size_t无符号整数 printf(字符串长度%zu\n, len); // %zu是size_t的专属格式化符输出7 return 0; }3. 新手必注意坑点返回值是无符号数千万别用来做减法错误示例if (strlen(a) - strlen(abc) 0)会判定为 “真”因为无符号数不会是负数1-3-2会被当成超大正数正确做法直接比较长度if (strlen(a) strlen(abc))或转成 intif ((int)strlen(a) - (int)strlen(abc) 0)。说简单点就是strlen函数做减法得到的值一定不会是负数因为返回值类型是size_t。想探索本质的可以去看看整数存储补码和类型转换的知识4. 模拟实现懂底层更易避坑size_t my_strlen(const char *str) { size_t count 0; while (*str ! \0) { // 碰到\0就停止计数 count; str; } return count; }二strcpy/strncpy给字符串 “搬新家”1. strcpy无长度限制核心作用把源字符串的所有字符包括 \0拷贝到目标数组代码演示char dest[20]; // 目标数组要够大 char src[] 我要拷贝这个字符串; strcpy(dest, src); printf(拷贝后%s\n, dest); // 输出“我要拷贝这个字符串”坑点目标数组空间不够会导致内存溢出新手尽量少用。2. strncpy更安全的带长度限制版核心作用指定拷贝的字符个数避免溢出代码演示char dest[10]; char src[] 1234567890; strncpy(dest, src, 5); // 只拷贝前5个字符 dest[5] \0; // 关键strncpy不会自动加\0手动补 printf(指定拷贝5个%s\n, dest); // 输出12345strcpy vs strncpy 对比特点strcpystrncpy拷贝长度拷贝到 \0 为止整串拷贝指定个数的字符安全性易溢出更安全可控长度\0 处理自动拷贝 \0需手动补 \03. 模拟实现以 strcpy 为例char *my_strcpy(char *dest, const char *src) { char *ret dest; // 保存目标首地址方便返回 while (*dest *src) { // 逐个拷贝直到拷贝完\0 ; } return ret; // 返回目标地址支持链式调用 }三strcat/strncat给字符串 “接尾巴”1. strcat无长度限制核心作用把源字符串追加到目标字符串的末尾从目标的 \0 位置开始代码演示char dest[30] Hello, ; // 必须留够追加的空间 char src[] 小伙伴; strcat(dest, src); printf(拼接后%s\n, dest); // 输出Hello, 小伙伴坑点目标数组空间不足会溢出和 strcpy 同理。2. strncat更安全的带长度限制版核心作用指定追加的字符个数且自动补 \0比 strncpy 友好代码演示char dest[20] abc; char src[] 123456; strncat(dest, src, 3); // 只追加前3个字符 printf(指定追加3个%s\n, dest); // 输出abc123strcat vs strncat 对比特点strcatstrncat追加长度追加整串到 \0 为止追加指定个数的字符安全性易溢出更安全可控长度\0 处理自动加 \0自动加 \03. 模拟实现以 strcat 为例char *my_strcat(char *dest, const char *src) { char *ret dest; // 第一步找到目标字符串的\0位置 while (*dest ! \0) { dest; } // 第二步拷贝源字符串和strcpy逻辑一致 while (*dest *src) { ; } return ret; }四strcmp/strncmp给字符串 “比大小”1. strcmp比较整串核心规则按 ASCII 码值逐个比较字符直到找到不同或到 \01.字符串 1 字符串 2 →返回正数2.字符串 1 字符串 2 →返回负数3.字符串相等 →返回 0。代码演示char str1[] apple; char str2[] banana; char str3[] apple; printf(str1 vs str2%d\n, strcmp(str1, str2)); // 输出负数a b printf(str2 vs str1%d\n, strcmp(str2, str1)); // 输出正数 printf(str1 vs str3%d\n, strcmp(str1, str3)); // 输出02. strncmp比较前 n 个字符核心作用只比较指定个数的字符适合判断前缀、部分匹配代码演示char str1[] abcdef; char str2[] abcxyz; printf(比较前3个字符%d\n, strncmp(str1, str2, 3)); // 输出0前3个都是abcstrcmp vs strncmp 对比特点strcmpstrncmp比较长度比较到字符不同 / 全串结束只比较前 n 个字符适用场景比较整串相等 / 大小匹配前缀、部分比较3. 模拟实现以 strcmp 为例int my_strcmp(const char *str1, const char *str2) { while (*str1 *str2) { if (*str1 \0) { // 都到\0说明相等 return 0; } str1; str2; } return *str1 - *str2; // 返回字符ASCII码差值 }三、进阶工具strstr—— 找字符串里的 “子串”1.核心作用在主字符串中找子串找到返回子串第一次出现的地址没找到返回 NULL。2. 代码演示char str[] 我喜欢C语言C语言超有趣; char sub[] C语言; char *ret strstr(str, sub); if (ret ! NULL) { printf(找到子串%s\n, ret); // 输出C语言C语言超有趣 } else { printf(没找到子串\n); }3. 模拟实现理解匹配逻辑char *my_strstr(const char *str, const char *sub) { const char *s1 str; const char *s2 sub; const char *cur str; if (*sub \0) { // 子串为空返回主串首地址 return (char *)str; } while (*cur ! \0) { s1 cur; s2 sub; // 逐个匹配字符 while (*s1 ! \0 *s2 ! \0 *s1 *s2) { s1; s2; } if (*s2 \0) { // 子串匹配完找到啦 return (char *)cur; } if (*s1 \0) { // 主串完了还没找到 return NULL; } cur; // 起始位置后移重新匹配 } return NULL; }四、调试神器perror—— 给程序 “报错误”1.核心作用当代码出错比如文件打开失败、数组越界时打印 “自定义提示 系统错误原因”新手调试必备。2. 代码演示#include stdio.h #include stdlib.h int main() { // 故意打开不存在的文件制造错误 FILE *fp fopen(不存在的文件.txt, r); if (fp NULL) { perror(打开文件失败); // 输出打开文件失败: No such file or directory return 1; } fclose(fp); return 0; }五、新手避坑总清单重中之重\0 别漏strncpy 要手动补 \0数组定义留够 \0 的位置优先用带 n 的函数strncpy/strncat/strncmp 替代无长度限制的版本避免溢出strlen 别做减法记住它的返回值是无符号数比较长度直接用 /-数组空间要够拷贝 / 拼接前确认目标数组能装下源字符串 \0模拟实现加 const源字符串参数加 const 修饰避免误修改perror 看全信息重点看冒号后的系统错误描述才是真正的出错原因。结束语这些字符串函数看似多但核心逻辑都是 “围绕 \0 处理字符”。刚开始可以先记住用法和避坑点多敲几遍代码练手比如自己实现一遍 strlen、strcpy很快就能理解底层逻辑。新手别怕犯错踩过的坑都是经验慢慢就会越来越顺手啦