12 scanf和printf
正在加载视频播放器…
GESP C++ 一级:scanf 与 printf 精讲
核心目标:掌握 C 风格输入输出函数
scanf和printf的基本用法、格式控制符,理解与cin/cout的区别,能正确读写整数、浮点数、字符。
scanf读数据要加&,printf输出要写格式符;double在scanf中用%lf,在printf中用%f或%.2f。
一、什么是 scanf 和 printf
GESP 一级考纲明确要求掌握基础的 cin、scanf、cout、printf 语句。C++ 提供了两套完整的输入输出方式:
| 方式 | 来源 | 头文件 | 特点 |
|---|---|---|---|
cin / cout |
C++ | <iostream> |
自动识别类型,写起来简单 |
scanf / printf |
C | <cstdio> |
格式化控制强,大数据时更快 |
scanf 和 printf 在格式化输出方面更灵活,比如保留指定小数位数,用 printf 写起来很直观。一级考试中两种方式都可能出现,需要都能读懂、会写。
使用前需要包含头文件:
#include <cstdio>
using namespace std;
二、printf 输出
1. 基本语法
printf("格式字符串", 变量1, 变量2, ...);
- 格式字符串用双引号,里面可以写普通文字和格式控制符。
- 格式控制符以
%开头,按顺序对应后面的变量。 - 变量个数和类型要和格式控制符一一对应。
示例:
int a = 10;
printf("a = %d\n", a);
输出:
a = 10
2. 常用格式控制符
| 控制符 | 对应类型 | 说明 | 示例 |
|---|---|---|---|
%d |
int |
十进制整数 | printf("%d", 123); |
%lld |
long long |
长整数 | printf("%lld", 123LL); |
%f |
float / double |
浮点数,默认保留 6 位小数 | printf("%f", 3.14); |
%.2f |
保留 2 位小数 | printf("%.2f", 3.14); |
|
%c |
char |
单个字符 | printf("%c", 'A'); |
%s |
字符串 | printf("%s", "Hello"); |
|
%% |
无 | 输出一个 % |
printf("100%%"); |
重点:
printf中%f既可以输出float,也可以输出double。需要保留几位小数就写%.nf,如%.2f表示保留 2 位小数。
3. 保留小数输出
double ans = 3.14159;
printf("%.2f\n", ans);
输出:
3.14
double avg = 91.666666;
printf("%.2f\n", avg);
输出:
91.67
这是 GESP 一级很常见的格式化要求。
4. 输出多个变量
int a = 3, b = 5;
printf("%d + %d = %d\n", a, b, a + b);
输出:
3 + 5 = 8
5. 转义字符
printf 中常用的转义字符:
| 转义 | 含义 |
|---|---|
\n |
换行 |
\t |
制表符 |
\\ |
反斜杠 |
\" |
双引号 |
%% |
百分号 |
示例:
#include<bits/stdc++.h>
using namespace std;
int main()
{
// \n 换行
printf("第一行\n第二行\n");
// \t 制表符(相当于按Tab,对齐文字)
printf("姓名\t年龄\n小明\t12\n");
// \\ 输出反斜杠 \
printf("文件路径:C:\\code\\test.c\n");
// \" 输出双引号 "
printf("他说:\"你好!\"\n");
// %% 输出百分号 %
printf("及格率:95%%\n");
return 0;
}
运行输出结果
第一行
第二行
姓名 年龄
小明 12
文件路径:C:\code\test.c
他说:"你好!"
及格率:95%
三、scanf 输入
1. 基本语法
scanf("格式字符串", &变量1, &变量2, ...);
- 格式字符串用双引号,里面写格式控制符。
- 变量前必须加
&(取地址符),这是scanf和printf最大的区别。 - 变量个数和类型要和格式控制符一一对应。
示例:
int a;
scanf("%d", &a);
一级最高频易错点:
scanf中忘记写&,程序无法正确读入数据,甚至可能崩溃。
2. 常用格式控制符
| 控制符 | 对应类型 | 说明 |
|---|---|---|
%d |
int |
读入整数 |
%lld |
long long |
读入长整数 |
%f |
float |
读入单精度浮点数 |
%lf |
double |
读入双精度浮点数 |
%c |
char |
读入单个字符 |
%s |
字符数组 | 读入字符串(字符串名前不加 &) |
重点:
scanf中读取double必须用%lf,不能用%f。这一点和printf不同。
3. 连续输入多个变量
int a, b;
scanf("%d %d", &a, &b);
输入:
3 5
则 a = 3,b = 5。
也可以输入时用换行分隔:
3
5
scanf 会自动跳过空白字符。
4. 读入字符
char c;
scanf("%c", &c);
注意:scanf("%c", &c) 会读取下一个字符,包括空格和换行,不会自动跳过空白。如果要跳过空白再读字符,可以在 %c 前加一个空格:
scanf(" %c", &c);
5. 读入浮点数
double x;
scanf("%lf", &x);
float y;
scanf("%f", &y);
6. scanf 的返回值(了解)
scanf 返回成功读取的变量个数。例如:
int a, b;
int n = scanf("%d %d", &a, &b);
如果两个数都成功读入,n 为 2;如果只读入一个,n 为 1;如果读取失败,返回 EOF。一级了解即可,多用于循环读入。
四、scanf 与 printf 对照速查
| 数据类型 | scanf 写法 |
printf 写法 |
|---|---|---|
int |
scanf("%d", &a); |
printf("%d", a); |
long long |
scanf("%lld", &x); |
printf("%lld", x); |
float |
scanf("%f", &x); |
printf("%f", x); |
double |
scanf("%lf", &x); |
printf("%f", x); 或 printf("%.2f", x); |
char |
scanf("%c", &c); |
printf("%c", c); |
| 字符串 | scanf("%s", s); |
printf("%s", s); |
记忆口诀:
scanf 要加 &,printf 不用 &;
double 读用 %lf,double 写用 %f;
保留几位小数,写 %.n f。
五、scanf/printf 与 cin/cout 对比
| 项目 | cin / cout |
scanf / printf |
|---|---|---|
| 头文件 | <iostream> |
<cstdio> |
| 类型识别 | 自动识别 | 需要手动写格式符 |
| 取地址符 | 不需要 | scanf 需要 & |
| 格式化输出 | 需要 <iomanip> |
直接写 %.2f 等 |
| 执行速度 | 较慢 | 较快 |
| 适用场景 | 普通输入输出 | 大数据、格式化输出 |
cin/cout 能自动识别变量类型,写起来简单;scanf/printf 需要指定类型,但格式化控制更强,大数据时效率更高。一级考试中两种方式都可能出现,建议都掌握。
六、常见错误
-
scanf忘记写&scanf("%d", a); // 错误 scanf("%d", &a); // 正确 -
scanf读double用了%fdouble x; scanf("%f", &x); // 错误 scanf("%lf", &x); // 正确 -
printf输出double用了%lf(一级不推荐)printf("%lf", x); // 虽然能运行,但一级建议用 %f printf("%f", x); // 推荐 -
格式符和变量类型不匹配
int a; scanf("%f", &a); // 错误,类型不匹配 -
忘记
#include <cstdio>
使用scanf、printf必须包含。 -
printf中忘记写格式符printf(a); // 错误,不能直接输出变量 printf("%d", a); // 正确 -
scanf中变量前多写&或漏写&int a; scanf("%d", &a); // 正确字符串(字符数组)不需要
&:char s[20]; scanf("%s", s); // 正确,不需要 & -
输出
%忘记写%%printf("100%"); // 错误 printf("100%%"); // 正确
七、阅读程序写结果
题目 1
int a = 5, b = 3;
printf("%d + %d = %d\n", a, b, a + b);
输出:
5 + 3 = 8
题目 2
double x = 3.14159;
printf("%.2f\n", x);
输出:
3.14
题目 3
int a, b;
scanf("%d %d", &a, &b);
printf("%d\n", a * b);
输入:
4 6
输出:
24
题目 4
double x;
scanf("%lf", &x);
printf("%.3f\n", x);
输入:
2.5
输出:
2.500
题目 5
char c = 'A';
printf("%c %d\n", c, c);
输出:
A 65
题目 6
int sum = 275, n = 3;
double avg = 1.0 * sum / n;
printf("%.2f\n", avg);
输出:
91.67
八、总结
scanf 与 printf 是一级考试中输入输出的另一套重要工具。:
scanf读数据,变量前要加&。printf输出数据,不需要加&。int用%d,long long用%lld。scanf读double用%lf,printf输出double用%f。- 保留小数用
%.2f,数字几就保留几位。 char用%c,字符串用%s。- 输出百分号用
%%。 scanf/printf和cin/cout都要掌握,考试中按题目要求选择。