嵌入式菜鸟的进阶之路——C的输入输出
前言
输入输出(I/O)是 C 语言与用户交互的核心,也是嵌入式开发中调试、数据交互的基础。本文整理了我 学习 C 语言输入输出的笔记,从语句分类到getchar/putchar、scanf/printf的核心用法,搭配实操练习。
一、C 语言语句基础
1. 什么是语句
语句是完成特定操作的代码单元,以分号";"结尾。
二、输入与输出
1. 输入输出的本质
输入输出是相对于程序运行时所在的内存而言:
键盘/文件 → 输入 → 内存(程序) → 输出 → 终端/打印机/文件printf/scanf/getchar/putchar不是 C 语言语法本身,而是C 标准库(stdio.h)提供的函数;- 嵌入式开发中,这些函数是与终端 / 串口交互的基础。
2. 常用输入输出函数
| 函数对 | 功能 |
|---|---|
| getchar/putchar | 单个字符输入 / 输出 |
| gets/puts | 字符串输入 / 输出(数组) |
| scanf/printf | 格式化输入 / 输出 |
三、字符输入输出:getchar/putchar
1. getchar(字符输入)
函数原型(man 手册)
#include <stdio.h> int getchar(void);- 功能:从标准输入(键盘)读取单个字符;
- 参数:无参数;
- 返回值:成功返回读取字符的 ASCII 码值,失败 / 结束返回
EOF(-1)。
2. putchar(字符输出)
函数原型
#include <stdio.h> int putchar(int c);- 功能:将字符
c输出到终端; - 参数:
c为要输出字符的 ASCII 码值; - 返回值:成功返回输出字符的 ASCII 码值,失败返回
EOF。
四、格式化输出:printf
1. 函数原型
#include <stdio.h> int printf(const char *format, ...);- 功能:按指定格式输出数据到终端;
- 参数:
format:格式控制字符串(普通字符 + 占位符);...:可变参数(输出列表,与占位符一一对应);
- 返回值:成功返回输出的字符总数,失败返回负数。
2. 格式控制字符串
(1)普通字符:原样输出
printf("a = 10\n"); // 输出:a = 10(2)占位符:按类型格式化输出
| 数据类型 | 占位符 | 说明 |
|---|---|---|
| 整型 | %d | 有符号十进制 |
| 整型 | %u | 无符号十进制 |
| 整型 | %x/%X | 无符号十六进制(x 小写 / X 大写) |
| 整型 | %o | 无符号八进制 |
| 浮点型 | %f | 十进制小数(默认保留 6 位) |
| 浮点型 | %e/%E | 科学计数法(e 小写 / E 大写) |
| 浮点型 | %g | 简洁格式(去掉多余 0) |
| 字符型 | %c | 单个字符 |
| 字符串 | %s | 字符串(数组) |
(3)辅助控制符(精细化输出)
| 辅助符 | 作用 | 示例 | 输出效果 |
|---|---|---|---|
| # | 显示进制前缀(%#x/%#o) | printf("%#x", 123); | 0x7b |
| m(数字) | 控制输出宽度(右对齐) | printf("%5d", 123); | 123(补 2 个空格) |
| -m | 控制输出宽度(左对齐) | printf("%-5d", 123); | 123(补 2 个空格) |
| 0m | 宽度不足补 0 | printf("%05d", 123); | 00123 |
| .n(数字) | 浮点型保留 n 位小数(四舍五入) | printf("%.2f", 3.1415); | 3.14 |
| .n | 字符串保留前 n 个字符 | printf("%.3s", "hello"); | hel |
| l/ll | 长整型 / 长长整型 | printf("%lld", 1234567890123LL); | 完整大数 |
| L | long double 类型 | printf("%Lf", 1.23L); | 长双精度浮点 |
五、格式化输入:scanf(核心重点)
1. 函数原型
#include <stdio.h> int scanf(const char *format, ...);- 功能:从标准输入(键盘)读取数据并按格式存储到指定内存地址;
- 参数:
format:格式控制字符串(占位符为主,尽量少用普通字符);...:地址列表(变量地址,用&取地址);
- 返回值:成功返回读取的数据项数,失败返回
EOF。
2. 核心规则
(1)格式控制字符串
- 占位符与
printf基本一致,注意浮点型差异:%f→ 读取float类型,%lf→ 读取double类型,%Lf→ 读取long double类型;
%c会读取空白符(空格、回车、Tab),连续输入需注意(解决方案:加空白符匹配 /%*c跳过);- 尽量避免在
format中写普通字符(如scanf("a=%d", &a)需输入a=10,易出错)。
(2)地址列表
- 变量前必须加
&(取地址符),表示数据存储的内存地址; - 示例:
scanf("%d", &a);// 将输入的整数存到变量 a 的内存地址。
(3)输入结束条件
- 遇到空白符(空格、回车、Tab);
- 遇到非法字符(如
%d读取到逗号 / 字母); - 达到指定宽度(如
%3d只读取前 3 位数字)。
4. 输入缓冲区注意事项
键盘输入的数据会先存入输入缓冲区,scanf从缓冲区读取数据:
- 连续读取
%d+%c时,回车 / 空格会被%c读取,需在%c前加空格(如scanf("%d %c", &a, &c)); - 避免在
scanf末尾加\n(如scanf("%d\n", &a)),否则会一直等待输入。
六、学习小结
- 字符交互:
getchar/putchar适用于单个字符输入输出,注意 ASCII 码转换; - 格式化输出:
printf是核心,掌握占位符(% d/% f/% c)和辅助控制符(宽度等); - 格式化输入:
scanf需注意地址符&、输入缓冲区、%c读取空白符的问题;
