CC++ & Algorithm

C++格式化输入输出 scanf 和 printf

简单50
语言版本:C++Python
概述:用精确的配方做蛋糕——学会用scanf和printf输入输出数据。

跟计算机“对话”的秘籍: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%dfloat%fdouble%lfchar%cchar[]%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++”风格的输入输出工具:coutcin(需要 #include <iostream>)。它们用起来更简单,不用记格式说明符,也不用写 &

#include <iostream>
using namespace std;
int main() {
    int num;
    cout << "请输入一个整数:";
    cin >> num;
    cout << "你输入的是:" << num << endl;
    return 0;
}

cout<< 输出,cin>> 输入,而且 cin 不需要 &(因为 C++ 自动处理了)。不过,scanfprintf 在某些场合(比如需要精确控制格式、处理大量数据时)速度更快,而且学习它们能让你更理解计算机如何存储数据。建议初学者先掌握这两种方法,以后可以根据情况选用。

七、一张图总结要点

  • printf("格式", 变量1, 变量2...):输出时,格式字符串里的 %d%f 会依次被后面的变量值替换。
  • scanf("格式", &变量1, &变量2...):输入时,按格式读取数据,存入对应变量的地址。
  • 常见格式:%d 整数,%f 小数,%lf 双精度,%c 字符,%s 字符串。
  • 记住:每个 scanf 里的变量前都要加 &(字符串名除外)。
  • 先输出提示,再用 scanf 读取,用户才明白要输入什么。

学会 scanf 和 printf,就像拿到了计算机世界的一把钥匙。接下来你可以学习条件判断(if-else)和循环(for while),让程序能根据输入做不同的反应,写出更有趣的程序,比如猜数字游戏、成绩等级计算器!快去试试吧!

例题精讲

1单选题

在C++中使用printf输出一个整数变量a,应该使用哪个格式控制符?

A%d
B%f
C%c
D%s
2判断题

使用scanf输入整数时,需要在变量名前加取地址符号&,例如scanf("%d", &a);

3填空题
补全代码,实现输入两个整数并输出它们的和。\nint a, b;\nscanf("%d %d", ___);\nprintf("%d", a + b);
4单选题

使用printf输出一个浮点数时,默认保留几位小数?

A3位
B6位
C2位
D不保留小数
5填空题
补全代码,要求输出浮点数3.1415并保留两位小数。\nfloat f = 3.1415;\nprintf("___", f);