Skip to content

输入与输出(Input & Output)

程序通过输入获取数据,通过输出展示结果。C 语言标准库提供 printfscanf 作为最基本的控制台输入输出函数,定义在 <stdio.h> 中。


1. 输出:printf

1.1 基本用法

#include <stdio.h>

int main()
{
    printf("Hello, World!\n");                  // 输出纯文本
    printf("年龄:%d 岁\n", 25);                 // 带占位符
    printf("姓名:%s,分数:%.1f\n", "张三", 95.5); // 多个占位符
    return 0;
}

printf 的第一个参数是格式字符串,其中 % 开头的占位符会被后续参数替换。

1.2 常用格式占位符

占位符 对应类型 输出示例
%d / %i int(有符号十进制) 42-7
%u unsigned int 100
%f float / double 3.140000
%lf doublescanf 中必须,printf 中可用 %f 3.140000
%c char 'A'
%s 字符串(char* hello
%x / %X 十六进制(小写/大写) 2a / 2A
%o 八进制 52
%p 指针地址 0x7ffc1234
%% 输出百分号本身 %

1.3 格式控制

int    n = 42;
double pi = 3.1415926535;

printf("|%d|\n",   n);        // |42|
printf("|%6d|\n",  n);        // |    42|  (右对齐,6 字符宽度)
printf("|%-6d|\n", n);        // |42    |  (左对齐)
printf("|%06d|\n", n);        // |000042|  (用 0 填充)

printf("|%f|\n",   pi);       // |3.141593|  (默认 6 位小数)
printf("|%.2f|\n", pi);       // |3.14|      (保留 2 位小数)
printf("|%10.3f|\n", pi);     // |     3.142|(总宽 10,3 位小数)
格式控制 语法 含义
宽度 %6d 最少占 6 个字符位置,不足补空格
左对齐 %-6d 数字靠左,右侧补空格
精度 %.2f 小数点后保留 2 位
补零 %06d 宽度不足时用 0 而非空格填充

1.4 转义序列

序列 含义
\n 换行
\t 水平制表符(Tab)
\\ 反斜杠 \
\" 双引号
\' 单引号

2. 输入:scanf

2.1 基本用法

int age;
printf("请输入年龄:");
scanf("%d", &age);                // 注意 & 取地址符!
printf("你输入的年龄是:%d\n", age);

⚠️ 关键scanf 需要变量的地址&age),而非变量本身。因为 scanf 要修改该变量的值,必须知道它在内存中的位置。忘记写 & 是最常见的 scanf 错误。

2.2 读取多种类型

int    id;
float  score;
char   grade;

printf("输入学号 成绩 等级(空格分隔):");
scanf("%d %f %c", &id, &score, &grade);

scanf 默认以空白字符(空格、换行、Tab)分隔输入。

2.3 scanf 的返回值

int result = scanf("%d", &x);
if (result == 1) {
    printf("成功读取一个整数:%d\n", x);
} else {
    printf("输入格式错误!\n");
}

scanf 返回成功匹配并赋值的项数。使用返回值可以判断用户是否输入了有效数据。

2.4 常见陷阱与解决

问题 示例 原因与解决
忘记 & scanf("%d", x) x 是值,&x 是地址。必须传地址
残留换行符 先用 scanf("%d")scanf("%c") %d 后的换行符会被 %c 读走。在 %c 前加空格:scanf(" %c", &ch)
缓冲区溢出 scanf("%s", str) 没有长度限制 改用 scanf("%49s", str) 限制最大长度
类型不匹配 用户输入字母给 %d 检查 scanf 返回值

3. 字符输入输出:getcharputchar

当只需要处理单个字符时,getchar/putcharscanf/printf 更简洁:

char ch = getchar();   // 从标准输入读取一个字符
putchar(ch);           // 向标准输出写入一个字符
putchar('\n');

典型用法:逐字符回显直到遇到换行

int ch;                        // 注意:用 int 而非 char,
while ((ch = getchar()) != '\n' && ch != EOF) {  // 因为 EOF 通常是 -1
    putchar(ch);
}

4. printf vs scanf 对比

对比项 printf scanf
方向 程序 → 屏幕 键盘 → 程序
参数 传值 传地址&var
格式串 可含文字和占位符 通常只含占位符
double 占位符 %f 即可 必须 %lf
返回值 输出的字符数 成功匹配的项数

5. 完整示例:简易计算器

#include <stdio.h>

int main()
{
    double a, b;
    char op;

    printf("请输入算式(格式:数 运算符 数):");
    scanf("%lf %c %lf", &a, &op, &b);

    switch (op) {
        case '+': printf("%.2f + %.2f = %.2f\n", a, b, a + b); break;
        case '-': printf("%.2f - %.2f = %.2f\n", a, b, a - b); break;
        case '*': printf("%.2f * %.2f = %.2f\n", a, b, a * b); break;
        case '/':
            if (b != 0.0)
                printf("%.2f / %.2f = %.2f\n", a, b, a / b);
            else
                printf("错误:除数不能为零\n");
            break;
        default:
            printf("不支持的运算符\n");
    }

    return 0;
}

6. 总结

要点 说明
printf% 占位 %d 整数、%f 浮点、%c 字符、%s 字符串
scanf 必须传地址 scanf("%d", &x)——忘记 & 是最常见错误
double 输入用 %lf printf%f%lf 均可,scanf 中必须是 %lf
检查返回值 scanf 返回匹配项数,可判断输入是否合法
%c 前加空格 scanf(" %c", &ch) 跳过残留空白字符
字符 I/O getchar/putchar 处理单字符更轻量

作者: Qing | 修改日期: 2026-07-18