6.1 输入与输出

本篇学习标准输入输出流、`printf`、`scanf`、`getchar`、`fgets` 等基础接口,并能写出简单而稳妥的交互程序。

输入与输出

概念说明

C 标准库通过 <stdio.h> 提供了基础输入输出能力。 程序最常接触的三条标准流分别是:

  • stdin:标准输入
  • stdout:标准输出
  • stderr:标准错误输出

终端输出最常见的是 printfputsputchar,终端输入最常见的是 scanfgetcharfgets。 这些接口看起来都很基础,但一旦遇到格式控制、缓冲区长度和换行残留,就很容易出问题。

语法/规则

  1. printf 用格式化占位符输出数据,例如 %d%u%f%c%s%zu
  2. scanf 读取普通变量时,大多数情况下要传地址,例如 &age
  3. 读取字符串时应限制长度,例如 %19s,避免缓冲区溢出。
  4. 需要读取整行文本时,fgets 往往比 scanf("%s", ...) 更适合。
  5. getchar 适合逐字符读取输入,putchar 适合逐字符输出。
  6. scanf 有返回值,应该用它判断本次是否成功读到期望数量的数据。
  7. 混用 scanffgets 时,要特别小心输入缓冲区中残留的换行符。

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main(void) {
    char name[20];
    int age;

    printf("请输入姓名和年龄:");
    if (scanf("%19s %d", name, &age) != 2) {
        return 1;
    }

    printf("name = %s, age = %d\n", name, age);
    return 0;
}

输出结果:

1
2
请输入姓名和年龄:alice 20
name = alice, age = 20

常见错误

  1. scanf 读取普通变量时忘记传地址,例如把 &age 写成 age
  2. 读取字符串时不限制长度,导致缓冲区溢出风险。
  3. 混用 scanffgets 时不处理残留换行,结果下一次读取直接得到空行。
  4. 使用错误的格式控制符,导致输出错乱或输入解析失败。
  5. 只关心读取动作本身,却不检查返回值,结果在输入不合法时继续使用脏数据。
本文禁止转载
使用 Hugo 构建
主题 StackJimmy 设计 由 Hobin 魔改
最近构建时间:2026-04-17 19:07:48 CST
载入天数...载入时分秒...
发表了 1 篇文章 · 发表了 152 篇笔记 · 总计 18 万 0 千字