第4 章 键盘输入和屏幕输出 知识点整理
前置要求:使用
printf、scanf、getchar、putchar必须引入头文件#include <stdio.h>stdio.h:standard input output 标准输入输出库。
一、冯・诺依曼体系输入输出思想
计算机五大部件:输入设备、存储器、运算器、控制器、输出设备。
- 标准输入:键盘,数据送入内存;
- 标准输出:显示器,把内存数据打印展示。
4.1 格式化屏幕输出函数 printf
1. 语法格式
printf(格式控制字符串, 输出值参数表);
格式控制字符串由两部分组成:
- 普通字符:原样输出到屏幕;
- 格式转换说明 :
%开头占位,把后面变量的值填充到对应位置。
注意:printf 参数写变量值 ,不要加取地址符 &。
2. 基础格式字符
表格
| 格式符 | 功能说明 |
|---|---|
%d |
带符号十进制整数 |
%o |
八进制无符号整数(无前置 0) |
%x |
十六进制无符号整数(无前置 0x) |
%u |
无符号十进制整数 |
%f |
浮点数,默认输出 6 位小数(float、double 都使用 % f 输出) |
%e |
指数(科学计数法)形式浮点数 |
%g |
自动选用 % f/% e 更短格式,去除小数无效 0 |
%c |
输出单个字符 |
%s |
输出字符串 |
%% |
输出一个百分号% |
3. 附加修饰符(写在%和格式字母中间:%[修饰符]格式字符)
表格
| 修饰符 | 含义 | 示例 |
|---|---|---|
l |
长整型;%ld输出 long 类型 |
printf("%ld",num); |
L |
用于 long double,%Lf输出长双精度 |
printf("%Lf",x); |
m |
最小输出宽度 ;数据大于 m 按实际输出;不足补空格,默认右对齐 | %5d |
.n |
浮点数保留 n 位小数;字符串最多输出 n 个字符 | %7.2f |
- |
左对齐,不加-默认右对齐 |
%-5d |
0 |
数值不足宽度时左侧补 0,仅对数字有效 | %05d |
+ |
正数输出显示+号,负数自带负号不受影响 |
%+d |
# |
八进制输出带前导 0;十六进制输出带前导 0X | %#o、%#x |
* |
输出宽度由后续变量指定 | printf("%*d",m,i); |
示例代码片段
printf("%5d\n",21); // 21 右对齐,补空格
printf("%05d\n",21); //00021 空位补0
printf("%-5d\n",21); //21 左对齐
printf("%7.2f\n",3.1415926); // 3.14
4. 浮点数精度重点
表格
| 类型 | 位数 | 有效数字 |
|---|---|---|
| float | 32 位 | 6‑7 位十进制有效数字 |
| double | 64 位 | 15‑16 位十进制有效数字 |
| long double | 128 位 | 18‑19 位十进制有效数字 |
⚠️二进制浮点数不能精确表示全部十进制小数,存储存在舍入误差。
4.2 单个字符输入输出
1. 字符常量
- 字符常量 :单引号
' '包裹,如'A',内存存储对应的ASCII 码整数,占 1 字节。 - 字符串常量 :双引号
" "包裹,末尾自动隐藏结束符'\0'。 - 易混区分:
'5'是字符(ASCII 码 53);5是整型数字 5,二者完全不同。
2. 转义字符(\开头,表示特殊字符)
表格
| 转义字符 | 含义 |
|---|---|
\n |
换行 |
\t |
水平制表 Tab |
\r |
回车(光标回到本行开头,不换行) |
\b |
退格 |
\\ |
输出反斜杠\ |
\' |
单引号;\"双引号 |
\0 |
空字符,字符串结束标志 |
字符本质是整数,可以做算术运算: 大写字母 ASCII +32 = 对应小写字母;例
'B'+32等价'b'。A=65,a=97。
3. 字符 IO 函数
putchar(ch);输出单个字符;参数为字符变量 / 字符常量;无返回值 。 ❌错误写法:putchar(ch;)ch = getchar();没有参数! 从输入缓冲区读取一个字符,返回读到的字符,赋值给变量。 ❌错误写法:getchar(ch);
对比总结
getchar()/putchar():专门字符读写,运行速度快;scanf("%c",&ch)/printf("%c",ch):通用性强,格式更灵活。
4.3 格式化键盘输入 scanf
1. 语法格式
scanf("格式控制字符串", 参数地址列表);
❗核心易错点:地址列表必须传入变量内存地址,普通变量加
&取地址;数组名本身就是地址不用写 & ✅正确:scanf("%d",&a);❌错误 1:scanf("%d",a);忘记&(高考改错题高频考点) ❌错误 2:scanf("%7.2f",&a);scanf不支持.n 精度修饰,只支持宽度 m ❌错误 3:格式字符串末尾随意加\n,造成输入异常。
2.scanf 常用格式符
表格
| 格式符 | 作用 |
|---|---|
%d |
输入十进制整型 |
%o |
八进制输入 |
%x |
十六进制输入 |
%f |
输入 float 单精度浮点数 |
%lf |
输入 double 双精度浮点数(l 不能丢) |
%c |
输入单个字符;空格、回车、Tab 全部当作有效字符读取!大坑 |
%s |
读取字符串,遇到空格、回车就停止读取 |
附加修饰符:
l:%ld输入 long;%lf输入 double;L:%Lf输入 long double;m:限定读取最大字符宽度;例%3d只读 3 位数字;*:%*d读取数据,直接丢弃,不赋值任何变量。
3.scanf 输入结束条件
遇到下面任意一种情况,当前输入项读取结束:
- 遇到空格、回车、Tab 空白符;
- 达到设定读取宽度(如
%3d读完 3 个字符); - 遇到非法输入。
注意:
%d、%f会自动跳过开头空白字符;唯独%c不会跳过空白!
🔥本章重难点:输入缓冲区
键盘输入的数据不会直接交给程序,先存入输入缓冲区 ,回车符\n也留在缓冲区。 现象示例:
int x; char ch;
scanf("%d",&x);
scanf("%c",&ch);
输入:12↙ scanf("%d")读走数字 12,回车换行符\n残留在缓冲区; 接下来scanf("%c")直接读到残留换行符,不会等待新键盘输入。
4 种清除缓冲区残留字符的解决方案(考试优先前两种)
-
getchar();单独一行,读取丢弃缓冲区一个字符(最常用)scanf("%d",&x);
getchar(); //吃掉回车\n
scanf("%c",&ch); -
%c格式符前面加空格,空格自动跳过全部空白(空格 / Tab / 换行)scanf("%d",&x);
scanf(" %c",&ch); //%c前空格不可省略 -
scanf("%*c%c",&ch);使用%*c读取并丢弃一个字符 -
fflush(stdin);清空整个缓冲区;部分编译器不标准,考试不优先选用。
拓展:
scanf("%d %c%d", &a,&op,&b);,%d和%c中间写空格,代表忽略中间任意空白,输入可以打空格、回车。
本章高频错误汇总(高考改错题高频)
scanf忘记写取地址符&;printf 错误加&;getchar(ch);错误传参;getchar()不能放参数;scanf使用.n精度修饰,例如%7.2f;%c读取字符忽略缓冲区残留回车;- 混淆字符常量
'5'与数字 5,混淆'A'和"A"; - double 输入用
%f,应当使用%lf;输出 double 可以直接用%f。