摘要:本文记录了我完成第 42 号复古 C 代码修复任务的全过程。原始代码因使用 Turbo C 时代的非标准语法(如 clrscr()void main() 等),无法在现代编译器下直接运行。通过查阅 CSDN、GitHub及 AI 工具辅助理解,我在 VS Code + MinGW-w64 环境中逐条修复编译错误与警告,成功运行程序并理解其功能为“带交换标志优化的冒泡排序”。随后,我将项目代码托管至 Gitee,使用Visio绘制了程序流程图。全文包含环境配置、错误分析、代码修复、功能验证、版本管理及学习总结,旨在为 C 语言初学者提供一份可复现的老旧代码迁移实践参考。


1. 选题与准备

1.1 选题描述

课程开始时,老师发布了压缩包 GameCode155.rar,内含 155 个编号的 C 语言源文件。我解压后逐一浏览,出于对基础排序算法实现逻辑的兴趣,选择了 第 42 号题目(对应文件 42.c)。该程序虽无图形界面,但实现了经典的冒泡排序,逻辑清晰,适合作为我的第一个完整 C 语言调试项目。

1.2 开发环境

  • 操作系统:Windows 11
  • 代码编辑与编译工具VS Code 1.107.1
  • 编译器:MinGW-w64(GCC 15.2.0)
  • 关键插件:C/C++、Code Runner、GitLens
  • 辅助资源:CSDN 教程、GitHub 示例、知乎问答、豆包

2. 编译调试过程

2.1 初始编译报错

在 VS Code 中打开 42.c,打开终端执行:

gcc 42.c -o 42.exe

立即出现以下错误:

42.c:25:9: error: implicit declaration of function 'clrscr' [-Wimplicit-function-declaration]
   25 |         clrscr();
      |         ^~~~~~
42.c:31:17: error: implicit declaration of function 'exit' [-Wimplicit-function-declaration]
   31 |                 exit(0);
      |                 ^~~~
42.c:2:1: note: include '<stdlib.h>' or provide a declaration of 'exit'
    1 | #include <stdio.h>
  +++ |+#include <stdlib.h>
    2 | #define MAX 255
42.c:31:17: warning: incompatible implicit declaration of built-in function 'exit' [-Wbuiltin-declaration-mismatch]
   31 |                 exit(0);
      |                 ^~~~
42.c:31:17: note: include '<stdlib.h>' or provide a declaration of 'exit'
42.c: At top level:
42.c:46:2: error: stray '\32' in program
   46 | }
      |  ^
      ^

2.2 错误分析与修复(在 VS Code 中完成)

(1)clrscr() 未声明

通过 CSDN 搜索得知:clrscr() 是 Turbo C 特有函数,现代 GCC 不支持。
修复方案:使用 system("cls") 替代,并增加跨平台判断:

#include <stdlib.h>  // 必须包含,否则 system() 也会报错

#ifdef _WIN32
    system("cls");
#else
    system("clear");
#endif
(2)exit() 未声明

原因:未包含 <stdlib.h>
修复:在文件开头添加:

#include <stdlib.h>
(3)void main() 不符合标准

C99 标准规定 main 必须返回 int
修复

int main() {
    // ... 原有逻辑 ...
    return 0;
}
(4)输入缓冲区问题

原代码结尾为:

getchar(); getchar();

但在输入数字后,scanf 会留下换行符 \n,导致第一个 getchar() 直接读取它,程序闪退。
修复(参考 CSDN 高赞回答):

// 清空输入缓冲区中的剩余字符(包括换行符)
int c;
while ((c = getchar()) != '\n' && c != EOF);
getchar(); // 真正等待用户按键

2.3 成功编译运行

修复后,在 VS Code 终端重新编译:程序正常启动,无任何 Error 或 Warning,如下图所示


3. 代码理解与重命名

3.1 功能测试

运行程序,输入:

5
3 1 4 2 5

输出:

The sequence you input is:
   3   1   4   2   5
The sequence after bubble_sort is:
   1   2   3   4   5

确认程序功能:对用户输入的整数序列进行升序冒泡排序

3.2 算法亮点

  • 使用全局数组 R[MAX] 存储数据;
  • 引入 exchange 标志:若某趟排序无交换,说明已有序,提前退出;
  • 内层循环 自下向上扫描jn-1 递减到 i),将最小值“冒泡”至前端;
  • 最优时间复杂度可达 O(n)(输入已有序时)。

3.3 文件重命名

根据功能,将 42.c 重命名为:
42_冒泡排序.c


4. 绘制流程图

如下图:


5. 项目管理与版本控制

5.1 VS Code 项目管理

本项目全程在 VS Code 中开发:

  • 使用内置终端执行 gcc 编译;
  • 利用 Code Runner 插件一键运行;
  • 通过 GitLens 查看提交历史。

5.2 Gitee 代码托管

  1. 在 Gitee 创建公开仓库:

    rygv.zxk

  2. 在 VS Code 终端初始化 Git 并推送:
    git init
    git add .
    git remote add origin https://gitee.com/https://gitee.com/cmjslyy/rygv.zxk
    git push -u origin master
    

Gitee 仓库地址
https://gitee.com/https://gitee.com/cmjslyy/rygv.zxk


6. 总结

作为 C 语言初学者,这次任务让我收获远超预期:

  1. 理解了“标准”与“非标准”的区别:Turbo C 时代的代码依赖大量编译器扩展,迁移到现代环境必须回归 C 标准库;
  2. 掌握了基本调试方法:通过阅读 Error 信息、搜索解决方案、逐步验证,我学会了独立解决问题;
  3. 养成了规范编程习惯int main()、头文件完整性、输入缓冲处理等细节,不再是“可有可无”,而是程序健壮性的基石;
  4. 熟悉了现代开发工具链:VS Code + GCC + Git 的组合,让我体验到接近工业级的 C 语言开发流程。

虽然冒泡排序很简单,但修复这段“古老”代码的过程,让我真正体会到:编程不仅是写逻辑,更是与历史、标准和工具对话的过程


附录

  • Gitee 项目地址https://gitee.com/https://gitee.com/cmjslyy/rygv.zxk
  • 参考资料
    • CSDN:《C语言 clrscr 函数替代方法》
    • 菜鸟教程:《C 标准库 – stdlib.h》
    • B站:《VS Code 配置 C/C++ 开发环境(2025 最新版)》
    • 《C Primer Plus(第6版)》第9章、第12章

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐