C 教程

C 教程 C 语言简介 C 下载安装和环境配置 C 快速入门 C 语法 C 输出 C 注释 C 变量 C 数据类型 C 常量 C 运算符 C 布尔值 C If...Else 语句 C Switch 语句 C While 循环 C For 循环 C Break/Continue 语句 C 数组 C 字符串 C 用户输入 C 内存地址 C 指针

C 函数

C 函数 C 函数参数 C 作用域 C 函数声明 C 递归 C 数学函数

C 文件

C 创建文件 C 写入文件 C 读取文件

C 结构体

C 结构体 C 嵌套结构体 C 结构体和指针 C 联合体 C typedef

C 枚举

C 枚举

C 内存

C 内存管理

C 错误

C 错误 C 调试 C 空值 C 错误处理 C 输入验证

C 更多

C 日期 C 随机数 C 宏 C 代码组织 C 存储类 C 位运算符 C 固定宽度整数

C 项目

C 项目

C 参考资料

C 参考资料 C 关键词 C <stdio.h> C <stdlib.h> C <string.h> C <math.h> C <ctype.h> C <time.h>

C 标准库参考

C 标准库 - 参考手册 C 标准库 - <assert.h> C 标准库 - <ctype.h> C 标准库 - <errno.h> C 标准库 - <float.h> C 标准库 - <limits.h> C 标准库 - <locale.h> C 标准库 - <math.h> C 标准库 - <setjmp.h> C 标准库 - <signal.h> C 标准库 - <stdarg.h> C 标准库 - <stddef.h> C 标准库 - <stdio.h> C 标准库 - <stdlib.h> C 标准库 - <string.h> C 标准库 - <time.h>

C 实例

C 语言实例 C 经典100例 C 编译器 C 测验


C 调试

调试

调试是指查找并修复程序中的错误(bug)的过程。

bug 是指导致程序崩溃、运行异常或输出错误结果的错误。

在开始调试之前,请确保您的代码简洁且结构清晰。

  • 使用正确的缩进,保持代码结构清晰。
  • 为变量取清晰、有意义的名称,描述它们存储的内容。

简洁的代码更易于阅读,也更容易调试!

在以下章节中,我们将介绍几种常用的调试技巧。


1. 打印调试

使用 printf() 在代码的不同位置打印值,以查看哪里出了问题:

int x = 10;
int y = 0;
printf("Before division"); // Debug output
int z = x / y; // Crashes (division by zero)
printf("After division"); // Never runs

如果您没有看到"After divide",则表示程序在 x / y 处崩溃。


2. 检查变量值

打印变量以检查它们是否符合预期:

int x = 10;
int y = 5;
int result = x - y;

printf("Result: %d", result); // Result: 5

预期值为15?这意味着逻辑有误:请尝试使用x + y代替。


3. 使用调试器工具

像 Visual Studio、Code::Blocks 和 VS Code 这样的集成开发环境 (IDE) 都内置了与 C 语言兼容的调试器。这些工具可以让你:

  • 使用断点
  • 暂停程序
  • 逐行单步执行代码
  • 观察变量并查看其值变化时出现的异常情况

提示: 从使用 printf() 进行调试开始。熟悉之后,再探索 IDE 的调试器,以便更深入地了解代码。


4. 从错误信息中学习

C 编译器和运行时错误通常会告诉你哪里出了问题以及在哪里。例如:

error: expected ';' before 'printf'

简单解决方法: 补上缺失的分号!


使用安全检查进行调试

某些错误,例如除以零(本页第一个示例中使用),已知会导致程序崩溃。

如果您知道某个操作可能会失败,您可以提前进行检查,从而避免崩溃:

示例

int main() {
  int x = 10;
  int y = 0;

  printf("Before division ");

  if (y != 0) { // // 在进行除法运算之前,请检查 y 是否不为零。
    int z = x / y;
    printf("Result: %d ", z);
  } else {
    printf("Error: Division by zero!"); // // 打印错误信息而不是让程序崩溃。
  }

  printf("After division ");
  return 0;
}
亲自试一试 »

现在,程序不会崩溃,而是会打印错误信息并继续运行。这是编写安全、可调试代码的重要一环。

另一个例子 - 数组越界访问

访问数组外部的元素是另一个常见的错误。

在下面的示例中,我们使用 printf() 函数在访问索引值之前对其进行检查:

示例

int main() {
  int numbers[3] = {10, 20, 30};
  int index = 5;

  printf("Index = %d ", index);
  if (index >= 0 && index < 3) { // 请确保索引值在有效范围内(0 到 2)。
    printf("Value = %d ", numbers[index]);
  } else {
    printf("Error: Index out of bounds! ");
  }

  return 0;
}
亲自试一试 »

总结

  • 使用 printf() 打印值并跟踪代码。
  • 仔细阅读错误信息——它们通常会告诉你哪里出了问题。
  • 添加检查(例如 if (y != 0))以避免崩溃发生。
  • 准备好进行更深入的调试时,请使用 IDE 的调试器。
  • 调试有助于你更好地理解程序并更快地解决问题。

错误处理

调试是在开发过程中查找并修复代码中的错误,而错误处理则是在程序运行时处理问题,并在出现错误时执行特定代码。

在接下来的章节中,您将学习空指针和错误处理。