程序设计基础-No5课件知识点

第4 章 键盘输入和屏幕输出 知识点整理

前置要求:使用printf、scanf、getchar、putchar必须引入头文件 #include <stdio.h> stdio.h:standard input output 标准输入输出库。

一、冯・诺依曼体系输入输出思想

计算机五大部件:输入设备、存储器、运算器、控制器、输出设备。

  • 标准输入:键盘,数据送入内存;
  • 标准输出:显示器,把内存数据打印展示。

4.1 格式化屏幕输出函数 printf

1. 语法格式

复制代码
printf(格式控制字符串, 输出值参数表);

格式控制字符串由两部分组成:

  1. 普通字符:原样输出到屏幕;
  2. 格式转换说明 :%开头占位,把后面变量的值填充到对应位置。

注意: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. 字符常量

  1. 字符常量 :单引号' '包裹,如'A',内存存储对应的ASCII 码整数,占 1 字节。
  2. 字符串常量 :双引号" "包裹,末尾自动隐藏结束符'\0'。
  3. 易混区分:'5'是字符(ASCII 码 53);5是整型数字 5,二者完全不同。

2. 转义字符(\开头,表示特殊字符)

表格

转义字符 含义
\n 换行
\t 水平制表 Tab
\r 回车(光标回到本行开头,不换行)
\b 退格
\\ 输出反斜杠\
\' 单引号;\"双引号
\0 空字符,字符串结束标志

字符本质是整数,可以做算术运算: 大写字母 ASCII +32 = 对应小写字母;例 'B'+32 等价 'b'。A=65,a=97。

3. 字符 IO 函数

  1. putchar(ch); 输出单个字符;参数为字符变量 / 字符常量;无返回值 。 ❌错误写法:putchar(ch;)
  2. 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 读取字符串,遇到空格、回车就停止读取

附加修饰符:

  1. l:%ld输入 long;%lf输入 double;
  2. L:%Lf输入 long double;
  3. m:限定读取最大字符宽度;例%3d只读 3 位数字;
  4. *:%*d读取数据,直接丢弃,不赋值任何变量。

3.scanf 输入结束条件

遇到下面任意一种情况,当前输入项读取结束:

  1. 遇到空格、回车、Tab 空白符;
  2. 达到设定读取宽度(如%3d读完 3 个字符);
  3. 遇到非法输入。

注意:%d、%f会自动跳过开头空白字符;唯独%c不会跳过空白!

🔥本章重难点:输入缓冲区

键盘输入的数据不会直接交给程序,先存入输入缓冲区 ,回车符\n也留在缓冲区。 现象示例:

复制代码
int x; char ch;
scanf("%d",&x);
scanf("%c",&ch);

输入:12↙ scanf("%d")读走数字 12,回车换行符\n残留在缓冲区; 接下来scanf("%c")直接读到残留换行符,不会等待新键盘输入。

4 种清除缓冲区残留字符的解决方案(考试优先前两种)

  1. getchar(); 单独一行,读取丢弃缓冲区一个字符(最常用)

    scanf("%d",&x);
    getchar(); //吃掉回车\n
    scanf("%c",&ch);

  2. %c格式符前面加空格,空格自动跳过全部空白(空格 / Tab / 换行)

    scanf("%d",&x);
    scanf(" %c",&ch); //%c前空格不可省略

  3. scanf("%*c%c",&ch); 使用%*c读取并丢弃一个字符

  4. fflush(stdin);清空整个缓冲区;部分编译器不标准,考试不优先选用。

拓展:scanf("%d %c%d", &a,&op,&b);,%d和%c中间写空格,代表忽略中间任意空白,输入可以打空格、回车。

本章高频错误汇总(高考改错题高频)

  1. scanf忘记写取地址符&;printf 错误加&;
  2. getchar(ch);错误传参;getchar()不能放参数;
  3. scanf使用.n精度修饰,例如%7.2f;
  4. %c读取字符忽略缓冲区残留回车;
  5. 混淆字符常量'5'与数字 5,混淆'A'和"A";
  6. double 输入用%f,应当使用%lf;输出 double 可以直接用%f。
相关推荐
FLJwu1 小时前
运动相机采购选型避坑实战|第二篇
c语言·开发语言·数码相机·运动相机·oem 量产
lhbweilai2 小时前
分析FreeRTOS内核对象API的源码实现(六)
c语言·stm32·单片机
Brilliantwxx3 小时前
【STM32】RTC 完结篇:日期操作、闹钟中断与附录(时间戳 / 闹钟 / NTP)
服务器·c语言·stm32·单片机·嵌入式硬件·实时音视频
学逆向的3 小时前
C 悬空指针
c语言·开发语言·网络安全
·present·16 小时前
CSAPP(lecture 4_01)
c语言·c++
本地化文档20 小时前
llvm-libc-docs-l10n
c语言·github·gitcode·sphinx·llvm·crowdin
Felven21 小时前
B. Collecting Game
c语言
Felven21 小时前
C. Removing Smallest Multiples
c语言·开发语言
水饺编程1 天前
第2章:Linux 基础,重启命令
linux·c语言·汇编