C 语言从 0 入门(十八)|字符串常用操作与模拟实现

张开发
2026/4/21 10:21:13 15 分钟阅读

分享文章

C 语言从 0 入门(十八)|字符串常用操作与模拟实现
大家好我是网域小星球。在 C 语言编程中字符串是最常用的数据类型之一无论是姓名、文本、文件读写都离不开字符串操作。C 语言没有专门的字符串类型通过 ** 字符数组 结束符\0** 实现字符串而系统提供的字符串操作函数更是日常编码和笔试面试的高频考点。本篇我们系统梳理最核心的字符串函数讲解用法 手写模拟实现全程 VS2022 可直接运行彻底吃透字符串底层逻辑。目录一、本章学习目标二、字符串基础回顾三、字符串核心函数精讲1. 求字符串长度strlen2. 字符串拷贝strcpy3. 字符串拼接strcat4. 字符串比较strcmp四、核心字符串函数模拟实现1. 模拟实现 strlen五、字符串函数使用避坑指南六、本章核心总结下期预告一、本章学习目标学完本篇你将彻底掌握字符串的本质字符数组 结束符\0四大核心字符串函数strlen、strcpy、strcmp、strcat用法手写模拟实现核心字符串函数理解底层原理字符串函数使用避坑与注意事项字符串常见实战场景与代码编写二、字符串基础回顾C 语言中字符串是以 **\0ASCII 码 0** 作为结束标志的字符数组双引号包裹的字符串会自动在末尾添加\0。// 字符串定义末尾自动补\0 char str[] hello; // 等价于 char str[] {h,e,l,l,o,\0};注意没有\0的字符数组不是合法字符串操作会出现乱码。三、字符串核心函数精讲所有字符串函数都需要包含头文件string.h1. 求字符串长度strlen作用计算字符串有效长度不包含结束符\0函数原型size_t strlen(const char *str);使用示例#define _CRT_SECURE_NO_WARNINGS 1stdio.hstring.h int main() { char str[] hello world; // 计算字符串长度 int len strlen(str); printf(字符串长度%d\n, len); // 输出11 return 0; }注意strlen遇到\0就停止计算和数组大小无关。2. 字符串拷贝strcpy作用将一个字符串完整拷贝到另一个字符数组中包含\0函数原型char *strcpy(char *dest, const char *src);使用示例#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h #include string.h int main() { char str1[20] abc; char str2[20] hello; // 把str2拷贝到str1覆盖str1原有内容 strcpy(str1, str2); printf(拷贝后str1%s\n, str1); // 输出hello return 0; }注意目标数组空间必须足够大否则会越界崩溃。3. 字符串拼接strcat作用将一个字符串拼接到另一个字符串末尾覆盖原有\0函数原型char *strcat(char *dest, const char *src);使用示例#define _CRT_SECURE_NO_WARNINGS 1stdio.hstring.h int main() { char str1[30] hello ; char str2[] C language; // 拼接str2到str1末尾 strcat(str1, str2); printf(拼接后%s\n, str1); // 输出hello C language return 0; }注意目标数组必须预留足够空间且原有内容必须有\0。4. 字符串比较strcmp作用按 ASCII 值逐字符比较两个字符串返回比较结果函数原型int strcmp(const char *str1, const char *str2);返回值相等返回0str1 str2返回正数 str2返回负数使用示例#define _CRT_SECURE_NO_WARNINGS 1 stdio.h string.h int main() { char str1[] apple; char str2[] banana; int res strcmp(str1, str2); if (res 0) { printf(两个字符串相等\n); } else if (res 0) { printf(str1大于str2\n); } else { printf(str1小于str2\n); // 执行此句 } return 0; }四、核心字符串函数模拟实现笔试面试高频考点手写实现能彻底理解底层原理全程无依赖可直接运行。1. 模拟实现 strlen// 自定义求字符串长度 int my_strlen(const char *str) { int count 0; // 遍历字符串直到\0停止 while (*str ! \0) { count; str; } return count; }2. 模拟实现 strcpy// 自定义字符串拷贝 char *my_strcpy(char *dest, const char *src) { char *start dest; // 逐字符拷贝包含\0 while (*src ! \0) { *dest *src; dest; src; } *dest \0; // 手动添加结束符 return start; }3. 模拟实现 strcat// 自定义字符串拼接 char *my_strcat(char *dest, const char *src) { char *start dest; // 找到目标字符串末尾\0 while (*dest ! \0) { dest; } // 逐字符拼接 while (*src ! \0) { *dest *src; dest; src; } *dest \0; return start; }4. 模拟实现 strcmp// 自定义字符串比较 int my_strcmp(const char *str1, const char *str2) { // 逐字符比较 while (*str1 *str2) { if (*str1 \0) { return 0; // 完全相等 } str1; str2; } // 返回字符差值 return *str1 - *str2; }自定义函数测试代码#define _CRT_SECURE_NO_WARNINGS 1 stdio.h // 上方自定义函数代码粘贴此处 int main() { // 测试my_strlen printf(长度%d\n, my_strlen(test)); // 测试my_strcpy char str1[20] {0}; my_strcpy(str1, hello); printf(拷贝%s\n, str1); // 测试my_strcat my_strcat(str1, world); printf(拼接%s\n, str1); // 测试my_strcmp printf(比较%d\n, my_strcmp(abc, abd)); return 0; }五、字符串函数使用避坑指南目标数组空间不足使用strcpy、strcat时必须保证目标数组足够大否则内存越界导致程序崩溃遗漏\0字符数组忘记添加结束符所有字符串函数都会出错输出乱码常量字符串修改char *str hello是字符串常量不能修改否则程序崩溃指针越界遍历字符串时超出有效范围访问导致未知错误混淆strlen和sizeofstrlen是有效长度sizeof是数组占用内存大小六、本章核心总结字符串核心标志是 **\0**所有操作围绕结束符展开strlen计算有效长度不含\0strcpy完整拷贝字符串必须保证目标空间足够strcat拼接字符串找到目标末尾\0后开始追加strcmp按 ASCII 值逐字符比较返回差值手写模拟实现能深入理解字符串底层逻辑应对笔试面试下期预告下一篇我们学习 C 语言另外两种自定义类型共用体和枚举掌握特殊数据存储方式和固定常量定义拓展数据类型使用场景。

更多文章