输入与输出(Input & Output)
程序通过输入获取数据,通过输出展示结果。C 语言标准库提供 printf 和 scanf 作为最基本的控制台输入输出函数,定义在 <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 |
double(scanf 中必须,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. 字符输入输出:getchar 与 putchar
当只需要处理单个字符时,getchar/putchar 比 scanf/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