跳转至

第 5 章:综合项目——命令行通讯录

📋 本章概览

项目 内容
学习时长 60 分钟
核心概念 项目拆分、输入边界、文件持久化、内存安全
核心比喻 把前四章的零件组装成一间可工作的服务台
实践任务 完成可保存和查询联系人的命令行程序
难度等级 ★★★★☆

完成一个命令行通讯录,支持:

  • 新增联系人
  • 按姓名查询
  • 列出全部联系人
  • 保存到文本文件
  • 启动时加载已有数据

验收标准

  • 编译命令开启 -Wall -Wextra -pedantic
  • 输入过长时不会写出数组边界
  • 文件打开失败时显示原因并安全退出
  • 退出前释放动态内存
  • 至少拆成一个头文件和两个源文件

调试建议

如果程序出现崩溃,先用 AddressSanitizer 编译:

cc -std=c17 -Wall -Wextra -fsanitize=address,undefined -g *.c -o contacts
./contacts

它可以帮助发现越界访问、释放后使用等问题。工具报告的是线索,仍然需要你理解数据生命周期并修复根因。

✅ 验证步骤

  1. 用编译器警告选项编译,确保没有未处理警告。
  2. 新增、查询、列出联系人,并重启程序验证持久化。
  3. 输入超长文本、空文件和不存在的文件,确认程序安全处理。
  4. 使用 AddressSanitizer 运行完整流程,确认没有内存错误。

📝 本章总结

  • 可交付项目必须同时考虑功能、边界和失败路径。
  • 编译器警告和运行时检测器都是开发反馈回路。
  • 模块拆分能降低修改和测试的成本。

✏️ 课后练习

  1. 增加删除联系人和按电话查询功能。
  2. 为文件解析和联系人查找编写独立测试。

🔮 学完之后

建议继续学习调试与测试,把本项目的错误定位和回归验证自动化。