一、🏰《数字王国的传声筒》
—— C 风格输入输出(scanf / printf)奇幻故事课
1、认识两位主角 🎭
在C++ 王国里,有一条古老又强大的魔法体系,叫做:
✨C 风格输入输出
它的两位主角是:
| 名字 | 作用 |
|---|---|
| 🧙♂️ scanf | 听别人说话(输入) |
| 🧙♀️ printf | 大声念出来(输出) |
2、printf:会“念稿子”的播音员 🎤
1️⃣ 最简单的 printf
printf("Hello World!");📢 播音员说:
Hello World!
👉双引号里的内容,原封不动念出来
2️⃣ printf 会“留空位”等数字 📦
如果你想说:
“我今年 10 岁”
就不能直接写死数字,而是:
int age = 10; printf("我今年 %d 岁", age);🧩%d是什么?
它是一个占位符,意思是:
“这里等一个整数来!”
3、printf 的“变形金刚符号”大全 🤖
🎯 常用格式符
| 符号 | 意思 | 举例 |
|---|---|---|
%d | 整数 | 10 |
%f | 小数 | 3.14 |
%c | 字符 | 'A' |
%s | 字符串 | "cat" |
%lld | 很大的整数 | long long |
printf("%d %f %c %s", 10, 3.14, 'A', "cat");📢 输出:
10 3.140000 A cat(注意:小数默认打印 6 位)
4、控制小数:小数精灵 ✨
1️⃣ 控制小数点后几位
printf("%.2f", 3.14159);📢 输出:
3.14🧠 规则:
%.2f→ 保留2 位小数
2️⃣ 让数字“站得整整齐齐” 📏
printf("%5d", 12);📢 输出:
12解释:
总共 5 个位置
数字只有 2 位
前面补空格
3️⃣ 左对齐 vs 右对齐 🧍♂️🧍♀️
printf("|%5d|\n", 12); printf("|%-5d|\n", 12);📢 输出:
| 12| |12 |🧠 小口诀:
%5d→右对齐%-5d→左对齐
4️⃣ 用 0 补位(像时间一样) ⏰
printf("%05d", 42);📢 输出:
000425、scanf:会“听指令”的小机器人 🤖
1️⃣ 最基础用法
int x; scanf("%d", &x);🧠 故事理解:
%d:我要一个整数&x:把听到的数,放进 x 的盒子里
⚠️& 非常重要!
没有它,机器人不知道往哪放数据!
2️⃣ 一次听多个数字 👂👂
int a, b; scanf("%d %d", &a, &b);输入:
3 53️⃣ 听小数、字符、字符串 🎶
double d; char c; char s[20]; scanf("%lf", &d); scanf(" %c", &c); // 注意前面的空格! scanf("%s", s);🧠 为什么%c前要加空格?
因为:
键盘里可能还残留一个“回车键幽灵” 👻
加空格可以吃掉它!
6、scanf 的“精准读取魔法” 🎯
1️⃣ 限制字符串长度(防止炸掉) 💥
char name[6]; scanf("%5s", name);最多只读5 个字符(留 1 个给结尾)
2️⃣ 按固定格式读取(高级) 🧩
int h, m; scanf("%d:%d", &h, &m);输入:
12:307、printf + scanf 完整小故事 🌈
#include <cstdio> int main() { int age; double score; printf("请输入你的年龄:"); scanf("%d", &age); printf("请输入你的分数:"); scanf("%lf", &score); printf("你今年 %d 岁,考试得了 %.1f 分!\n", age, score); return 0; }📢 输出示例:
你今年 10 岁,考试得了 98.5 分!8、给小学生的终极口诀 🧠✨
🪄 printf 口诀
有 % 就要给
给的顺序不能乱
想要几位写几位
🪄 scanf 口诀
scanf 读数据
变量前面要加 &
字符注意空格吃
9、C 风格 vs C++ 风格(悄悄说) 🤫
| 风格 | 特点 |
|---|---|
| scanf / printf | 快、严谨、竞赛常用 |
| cin / cout | 好理解、适合初学 |
二、🏆 小学生 → 竞赛级
——C风格 输入与输出格式专项训练
🟢 第一阶段:入门稳固(1–5 题)
目标:不写错、不慌、不乱
✅ 第 1 题:最基础输出
题目
输出下面一句话(完全一样):
I love C++!参考答案
printf("I love C++!");解析
字符串原样输出
不涉及变量和格式符
✅ 第 2 题:整数输出
题目
定义一个整数x = 8,输出:
x = 8参考答案
int x = 8; printf("x = %d", x);解析
%d对应int一个
%对应一个变量
✅ 第 3 题:多个整数
题目
输入两个整数a b,输出:
a+b=?参考答案
int a, b; scanf("%d %d", &a, &b); printf("a+b=%d", a + b);解析
scanf读整数必须加&输出中
=和+都是普通字符
✅ 第 4 题:小数默认输出
题目
输入一个double,直接输出它
参考答案
double x; scanf("%lf", &x); printf("%f", x);解析
double用%lf读printf用%f打印默认6 位小数
✅ 第 5 题:字符与整数混合
题目
输入一个字符和一个整数,输出:
A 10参考答案
char c; int x; scanf(" %c %d", &c, &x); printf("%c %d", c, x);解析
%c前的空格:吃掉回车混合输入要注意顺序
🟡 第二阶段:格式控制(6–10 题)
目标:整齐、好看、可控
✅ 第 6 题:控制小数位数
题目
输入一个小数,输出保留 2 位
参考答案
double x; scanf("%lf", &x); printf("%.2f", x);解析
%.2f:保留两位,四舍五入
✅ 第 7 题:右对齐输出
题目
输出整数42,占 5 个位置
参考答案
printf("|%5d|", 42);解析
不够的位置用空格补在左边
默认右对齐
✅ 第 8 题:左对齐输出
题目
同样占 5 个位置,但左对齐
参考答案
printf("|%-5d|", 42);解析
-表示左对齐
✅ 第 9 题:0 补位
题目
输出一个三位数,不足补 0
输入:7
输出:
007参考答案
int x; scanf("%d", &x); printf("%03d", x);解析
0:用 0 补位3:总宽度
✅ 第 10 题:宽度 + 精度
题目
输出小数,占 6 位,保留 1 位
参考答案
double x; scanf("%lf", &x); printf("%6.1f", x);解析
6:总宽度.1:小数位数
🟠 第三阶段:字符串与表格(11–15 题)
目标:竞赛中最容易丢分的地方
✅ 第 11 题:字符串输入输出
题目
输入一个名字,比如Tom , 输出:
Hello, Tom参考答案
char s[20]; scanf("%s", s); printf("Hello, %s", s);解析
字符数组不用
&%s遇空格会停
✅ 第 12 题:限制字符串长度
题目
最多读 5 个字符
参考答案
char s[6]; scanf("%5s", s);解析
留 1 位给
\0防止数组越界(竞赛必考)
✅ 第 13 题:整齐表格(一行)
题目
输出:
|Tom | 95|参考答案
printf("|%-5s|%3d|", "Tom", 95);解析
字符串左对齐
数字右对齐
✅ 第 14 题:多行表格
题目
输出:
|Tom | 95| |Bob |100|参考答案
printf("|%-5s|%3d|\n", "Tom", 95); printf("|%-5s|%3d|\n", "Bob", 100);✅ 第 15 题:固定格式输入
题目
输入时间12:30
参考答案
int h, m; scanf("%d:%d", &h, &m);解析
:必须完全匹配格式不对 → 读失败
🔴 第四阶段:竞赛级 IO(16–20 题)
目标:不翻车、不卡题、不 WA
✅ 第 16 题:多组输入直到 EOF
参考答案
int x; while (scanf("%d", &x) == 1) { printf("%d\n", x); }解析
scanf返回成功读入的个数EOF 是竞赛常见输入方式
✅ 第 17 题:cin + printf 混用(安全版)
ios::sync_with_stdio(false); cin.tie(nullptr); int x; cin >> x; printf("%d\n", x);解析
关闭同步,避免慢或乱序
✅ 第 18 题:高精度输出
题目
输出 15 位小数
参考答案
double x; scanf("%lf", &x); printf("%.15f", x);✅ 第 19 题:long long 输入输出
参考答案
long long x; scanf("%lld", &x); printf("%lld", x);解析
%lld是竞赛必背
✅ 第 20 题:综合终极题 ⭐
题目
输入:
Tom 95.5输出:
Name: Tom Score: 095.50参考答案
char name[20]; double score; scanf("%s %lf", name, &score); printf("Name: %s\n", name); printf("Score: %06.2f\n", score);解析
06:宽度 6,不足补 0.2:保留两位竞赛输出最常见组合
三、🎉 总结
🧠输入输出不是“语法”,而是“规则 + 细节 + 习惯”
做完这 20 题,你已经:
✅ 达到NOIP / CSP 入门级 IO 水平
✅ 不再害怕输出格式题
✅ 能一眼看出题目在“卡你什么格式”