C语言字符串处理:双指针删除特定字符实现
1. 项目概述这个C语言练习项目来自经典的菜鸟教程C经典100例系列中的第48题。作为C语言学习路上的必经之路这类编程练习能帮助我们巩固基础语法、培养算法思维。我在大学时期就曾反复刷过这套题目现在回头看依然觉得设计精妙。第48题看似简单却涵盖了指针操作、数组遍历、条件判断等多个核心知识点。它要求我们编写一个程序实现字符串中特定字符的删除功能。这种字符串处理在实际开发中非常常见比如数据清洗、日志过滤等场景都会用到。2. 题目分析与设计思路2.1 题目要求解析原始题目描述是编写一个函数删除字符串中的指定字符。例如输入字符串hello world和字符l输出应该是heo word。这个需求看似简单但需要考虑以下几个关键点字符串在C语言中以\0结尾需要处理字符多次出现的情况要考虑空字符串或未找到字符的特殊情况最好在原字符串上直接修改避免额外内存分配2.2 算法设计思路我设计了一个双指针算法来解决这个问题使用两个指针一个快指针用于遍历原字符串一个慢指针用于构建新字符串当快指针指向的字符不是要删除的字符时将其复制到慢指针位置最后在慢指针位置添加字符串结束符\0这种算法的时间复杂度是O(n)空间复杂度是O(1)非常高效。3. 代码实现详解3.1 基础版本实现#include stdio.h void delete_char(char *str, char c) { if (str NULL) return; char *p str; char *q str; while (*q) { if (*q ! c) { *p *q; } q; } *p \0; } int main() { char str[] hello world; printf(原始字符串: %s\n, str); delete_char(str, l); printf(删除l后: %s\n, str); return 0; }3.2 代码解析函数参数使用指针直接操作原字符串避免拷贝空指针检查防止传入NULL导致程序崩溃双指针操作p指针指向新字符串的当前位置q指针遍历原字符串结束处理最后添加\0确保字符串正确终止3.3 边界情况处理在实际使用中我们需要考虑更多边界情况void delete_char_enhanced(char *str, char c) { if (str NULL || *str \0) return; char *p str; char *q str; while (*q) { if (*q ! c) { *p *q; } q; } *p \0; // 处理全删除的情况 if (p str) { *str \0; } }4. 常见问题与调试技巧4.1 常见错误忘记添加字符串结束符\0导致输出异常对常量字符串进行操作如char *str hello会导致段错误指针越界访问特别是在空字符串情况下4.2 调试技巧使用printf调试指针位置printf(p%p, q%p\n, p, q);检查中间结果printf(当前字符: %c, 是否保留: %d\n, *q, *q ! c);使用gdb调试gcc -g program.c gdb ./a.out break delete_char run4.3 性能优化虽然这个算法已经很高效但在处理超长字符串时还可以进一步优化使用寄存器变量register char *p str; register char *q str;减少指针解引用char ch; while ((ch *q)) { if (ch ! c) { *p ch; } }5. 扩展应用与变体5.1 删除多个字符我们可以扩展函数支持删除多个字符void delete_chars(char *str, const char *chars) { if (str NULL || chars NULL) return; char *p str; char *q str; while (*q) { if (!strchr(chars, *q)) { *p *q; } q; } *p \0; }5.2 删除连续重复字符另一个有用的变体是删除连续重复字符void delete_duplicates(char *str) { if (str NULL || *str \0) return; char *p str; char *q str; char last \0; while (*q) { if (*q ! last) { *p *q; last *q; } q; } *p \0; }6. 实际应用场景这个简单的字符串处理函数在实际开发中有很多应用数据清洗去除日志中的特定控制字符用户输入处理过滤掉不允许的字符文本处理格式化字符串输出协议处理移除报文中的特定分隔符我在一个网络协议解析项目中就使用过类似的技巧用来处理TCP流中的特殊控制字符效果非常好。7. 测试用例设计完善的测试是保证代码质量的关键以下是一些必要的测试用例void test_delete_char() { char test1[] hello; delete_char(test1, l); assert(strcmp(test1, heo) 0); char test2[] aaaa; delete_char(test2, a); assert(strcmp(test2, ) 0); char test3[] ; delete_char(test3, a); assert(strcmp(test3, ) 0); char test4[] abc; delete_char(test4, d); assert(strcmp(test4, abc) 0); printf(所有测试通过\n); }8. 进阶思考8.1 内存安全考虑在实际项目中我们还需要考虑缓冲区溢出风险多线程安全问题异常处理机制8.2 与其他语言的对比在高级语言中这个操作通常更简单Python:s hello world s s.replace(l, )但理解C语言的实现方式有助于我们深入理解计算机如何处理字符串。8.3 性能测试我们可以编写一个简单的性能测试#include time.h void performance_test() { char long_str[1000000]; memset(long_str, a, sizeof(long_str)-1); long_str[sizeof(long_str)-1] \0; clock_t start clock(); delete_char(long_str, a); clock_t end clock(); printf(处理100万字符耗时: %f秒\n, (double)(end - start) / CLOCKS_PER_SEC); }9. 编码风格建议在实现这类基础函数时良好的编码风格很重要添加详细的函数注释使用有意义的变量名保持函数单一职责添加必要的参数检查编写完整的单元测试例如/** * 从字符串中删除指定字符 * param str 要处理的字符串(会被修改) * param c 要删除的字符 * note 该函数会直接修改原字符串 * warning 不要传入字符串常量 */ void delete_char(char *str, char c) { // 实现略 }10. 学习收获与总结通过这个练习我巩固了几个重要的C语言知识点指针的高效使用字符串的内存表示原地算法设计边界条件处理在实际编码中我发现最容易出错的地方是忘记处理字符串结束符。经过多次调试后我养成了在修改字符串后立即添加\0的习惯。这个练习虽然简单但很好地展示了C语言处理字符串的核心思想。建议初学者可以多尝试类似的练习逐步培养对指针和内存的敏感度。

相关新闻

VVC帧间预测与运动补偿进阶:AFFINE/AMVR/GBi/CIIP/SMVD工程实战与性能调优

VVC帧间预测与运动补偿进阶:AFFINE/AMVR/GBi/CIIP/SMVD工程实战与性能调优

引言:帧间预测是压缩的"核心引擎"帧间预测利用视频的时间冗余性,用已编码帧的像素预测当前帧,仅编码残差和运动信息。它是视频编码中压缩效率的核心环节,尤其对于运动场景、摄像机运动、物体形变,帧间预测的…

2026/10/16 23:56:42 阅读更多 →
C语言基础PDF学习指南:从编译环境到指针实战

C语言基础PDF学习指南:从编译环境到指针实战

简介:一份面向C语言初学者的入门基础PDF,系统讲解从程序设计与C语言起源、编译与解释执行,到变量与输入、表达式与运算符、判断结构等核心知识。内容包含欧几里德算法求最大公约数、时间差计算、英制身高换算等经典示例,并附有可直…

2026/10/17 5:32:12 阅读更多 →
YOLOv5工地双任务实战:安全帽检测+危险区域识别

YOLOv5工地双任务实战:安全帽检测+危险区域识别

简介:本资源是一套面向计算机视觉初学者与工程实践者的工地智能安全监控系统完整实现,聚焦YOLOv5目标检测技术在安全帽佩戴识别与危险区域闯入预警两大刚需场景的落地应用。资源包含可直接运行的源码、超详细训练教程及配套数据集构建指南,覆…

2026/10/15 19:10:20 阅读更多 →

最新新闻

OpenClaw接入个人电脑后,全自动操作磁盘文件,完整从零本地部署教程来了!TaoToken统一Key配置指南

OpenClaw接入个人电脑后,全自动操作磁盘文件,完整从零本地部署教程来了!TaoToken统一Key配置指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 15:39:07 阅读更多 →
SQL Server 2008误删数据恢复:No backup set found故障实战指南

SQL Server 2008误删数据恢复:No backup set found故障实战指南

简介:本资源是一份面向SQL Server数据库管理员与运维工程师的实战型数据恢复指南,聚焦SQL Server 2008环境下误删数据的紧急抢救方案。内容系统梳理了基于完整恢复模式(Full Recovery)的原生T-SQL三步恢复法(事务日志备…

2026/10/17 15:39:07 阅读更多 →
Unity文字提示标牌效果:用Transform.LookAt与DynamicLine实现动态指向

Unity文字提示标牌效果:用Transform.LookAt与DynamicLine实现动态指向

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 15:39:07 阅读更多 →
Jupyter中TensorFlow直读HDFS:从环境配置到代码实现

Jupyter中TensorFlow直读HDFS:从环境配置到代码实现

1. 先想清楚:为什么非要在Jupyter里直接读HDFS前阵子帮项目组调一个文本分类模型,训练数据全在Hadoop生态的HDFS上,而算法同学习惯用Jupyter Notebook做快速验证。问题来了:训练脚本里tf.data那套流水线要在本地跑通,数…

2026/10/17 15:39:07 阅读更多 →
TensorFlow Hub加载BERT预训练模型实战:从环境配置到文本分类微调

TensorFlow Hub加载BERT预训练模型实战:从环境配置到文本分类微调

1. 为什么要在TensorFlow Hub上加载BERT做自然语言处理项目的朋友,大概率都绕不开BERT这个模型。2018年谷歌把它放出来之后,几乎重新定义了NLP领域的玩法——以前做文本分类、情感分析、问答系统,你得自己搭词向量、设计网络结构、调参调到怀…

2026/10/17 15:39:07 阅读更多 →
自适应滤波器毕设全流程:LMS与RLS算法从设计到答辩

自适应滤波器毕设全流程:LMS与RLS算法从设计到答辩

简介:这份资源是南京航空航天大学电子信息工程学院硕士课程「自适应滤波器设计及应用」的完整论文文档,面向通信、电子与通信工程等专业学生及需要完成相关毕业设计的学习者,帮助系统梳理自适应滤波器的理论基础、算法实现与MATLAB仿真验证。…

2026/10/17 15:38:06 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →