C++格式化输入输出 scanf 和 printf
简单50跟计算机“对话”的秘籍:scanf 和 printf 详解
你有没有想过,怎么让计算机听懂你说的话,再把它计算的结果告诉你?在 C++ 里,我们用 printf 来“说”出结果,用 scanf 来“听”你输入的信息。它们就像你和计算机之间的一台翻译机,住在 <cstdio> 这个“工具包”里(或者用 <stdio.h> 也行)。学会了它们,写程序就像跟朋友聊天一样简单。
一、scanf 和 printf 是干什么的?
- printf:把数据“打印”到屏幕上。比如你写
printf("Hello!"),屏幕上就会显示 Hello!。 - scanf:从键盘“读”取你输入的数据,然后存到变量里。比如你写
scanf("%d", &num),程序就会等你敲一个数字,然后把这个数字放进 num 这个变量里。
它们俩就像教室里的“广播员”和“记录员”:广播员(printf)大声宣布结果,记录员(scanf)认真记下同学们说的数字。
二、格式说明符 —— 配方的关键
假设你要做一个蛋糕,配方上会写“面粉 200 克,鸡蛋 2 个,糖 50 克”。在编程里,我们也需要用“配方”来告诉计算机:接下来要处理的是整数、小数还是字符。这个“配方”就是 格式说明符。
| 格式说明符 | 代表类型 | 生活例子 | 说明 |
|---|---|---|---|
%d | 整数 | 考试分数、零花钱 | 没有小数点,比如 95、-3 |
%f | 小数 | 身高 1.65 米、体温 36.5℃ | 默认显示 6 位小数,比如 3.140000 |
%lf | 双精度小数 | 科学计算、圆周率 | 比 %f 精度更高,用 scanf 读 double 类型时必须用 %lf |
%c | 字符 | 字母、标点符号 | 只读一个字符,比如 'A'、'#' |
%s | 字符串 | 名字、单词 | 读一串字符,遇到空格或回车停止 |
“配方”里还可以加一些修饰,比如 %.2f 表示保留两位小数。
例子:
printf("圆周率约等于 %.2f\n", 3.14159); // 输出:圆周率约等于 3.14
三、scanf 的“秘密武器”:& 符号
为什么 scanf 要在变量前面加一个 &?想象你有一封信要寄给朋友,地址必须写对,信才能送到。在程序中,变量就像一栋房子,& 符号就是房子的门牌号(地址)。scanf 必须知道这个地址,才能把输入的数据“塞”进房子里。如果没有 &,计算机就找不到房子,数据会丢到垃圾桶里!
看这个例子:
int score; // score 是“分数”变量
scanf("%d", score); // ❌ 错误:忘写 &,数据不知道存到哪里
scanf("%d", &score); // ✅ 正确:告诉 scanf 变量 score 的地址
再举个生活中的例子:老师让班长(scanf)把同学们的考试成绩(输入)登记到学籍表里。班长必须知道每个同学坐在哪个座位(地址),才能把分数写对位置。& 就是那个座位号。
四、新手最容易犯的三个错误
错误 1:忘记写 &(地址符号)
这是最常见的错误,没有之一!编译可能不报错,但运行时会读取到错误的数据,甚至程序崩溃。
int age;
scanf("%d", age); // ❌ 缺少 &,数据乱存
printf("你今年 %d 岁", age);
解决方法:每次写 scanf 时,检查变量前有没有 &(除了数组名和字符串自己,它们本身是地址,不需要 &,但初学者先记住一定要加 &)。
错误 2:格式说明符和变量类型不匹配
double price = 19.99;
printf("价格是 %d 元\n", price); // ❌ %d 用于整数,price 是小数,输出会混乱
double weight;
scanf("%f", &weight); // ❌ 读 double 必须用 %lf,否则可能精度丢失
解决方法:记住对应表:int → %d,float → %f,double → %lf,char → %c,char[] → %s。
错误 3:scanf 中乱加文字
int x;
scanf("请输入一个整数:%d", &x); // ❌ 用户必须输入完全一样的文字,特别麻烦
正确做法:先用 printf 输出提示文字,scanf 里只写格式说明符(可以加空格或逗号,但不加普通文字)。
printf("请输入一个整数:");
scanf("%d", &x);
五、完整示例:零花钱计算器
小明每周有 20 元零花钱,他想算算自己两周能攒多少钱。我们来帮他用 scanf 和 printf 写一个程序:
#include <cstdio>
using namespace std;
int main() {
int weekly; // 每周零花钱
int weeks; // 几周
int total; // 总共的钱
printf("请输入每周零花钱(元):");
scanf("%d", &weekly); // 读入每周零花钱
printf("你想攒几周?");
scanf("%d", &weeks); // 读入周数
total = weekly * weeks; // 计算总钱数
printf("%d 周后你一共会有 %d 元!加油!\n", weeks, total);
return 0;
}
运行效果:
请输入每周零花钱(元):20
你想攒几周?3
3 周后你一共会有 60 元!加油!
六、printf 和 scanf 的“兄弟”:cout 和 cin
在 C++ 里,还有两个更“C++”风格的输入输出工具:cout 和 cin(需要 #include <iostream>)。它们用起来更简单,不用记格式说明符,也不用写 &:
#include <iostream>
using namespace std;
int main() {
int num;
cout << "请输入一个整数:";
cin >> num;
cout << "你输入的是:" << num << endl;
return 0;
}
cout 用 << 输出,cin 用 >> 输入,而且 cin 不需要 &(因为 C++ 自动处理了)。不过,scanf 和 printf 在某些场合(比如需要精确控制格式、处理大量数据时)速度更快,而且学习它们能让你更理解计算机如何存储数据。建议初学者先掌握这两种方法,以后可以根据情况选用。
七、一张图总结要点
- printf("格式", 变量1, 变量2...):输出时,格式字符串里的
%d、%f会依次被后面的变量值替换。 - scanf("格式", &变量1, &变量2...):输入时,按格式读取数据,存入对应变量的地址。
- 常见格式:
%d整数,%f小数,%lf双精度,%c字符,%s字符串。 - 记住:每个 scanf 里的变量前都要加
&(字符串名除外)。 - 先输出提示,再用 scanf 读取,用户才明白要输入什么。
学会 scanf 和 printf,就像拿到了计算机世界的一把钥匙。接下来你可以学习条件判断(if-else)和循环(for while),让程序能根据输入做不同的反应,写出更有趣的程序,比如猜数字游戏、成绩等级计算器!快去试试吧!
例题精讲
在C++中使用printf输出一个整数变量a,应该使用哪个格式控制符?
使用scanf输入整数时,需要在变量名前加取地址符号&,例如scanf("%d", &a);
补全代码,实现输入两个整数并输出它们的和。\nint a, b;\nscanf("%d %d", ___);\nprintf("%d", a + b);使用printf输出一个浮点数时,默认保留几位小数?
补全代码,要求输出浮点数3.1415并保留两位小数。\nfloat f = 3.1415;\nprintf("___", f);