14 · 输入 & 输出
printf 格式化占位符(必背)
| 占位符 | 类型 | 示例 |
|---|---|---|
%d / %i |
int | printf("%d", 10) |
%u |
unsigned | |
%ld / %lld |
long / long long | |
%f |
float / double | 默认 6 位小数 |
%.2f |
保留 2 位小数 | |
%c |
char | |
%s |
字符串 | |
%p |
指针地址 | |
%zu |
size_t(sizeof 结果) | |
%x / %o |
十六进制 / 八进制 |
printf("姓名: %s, 年龄: %d, 分数: %.1f\n", "Tom", 18, 95.5);
printf("地址: %p\n", (void*)&x);
scanf(最常见的坑都在这)
int n;
scanf("%d", &n); // ✅ 必须加 & 取地址
char name[20];
scanf("%s", name); // ✅ 数组名本身就是地址,不用 &
⚠️ 三大坑:
1. 忘了 & → 程序崩溃(把读到的值当地址写)。
2. scanf("%s", buf) 遇空格就停,且不检查缓冲区大小 → 溢出。
3. 输入类型不匹配时,后续读取会错乱。
- 安全替代:fgets() 读整行(见 20-未定义行为与安全函数)。
转义字符
\n 换行 · \t 制表 · \\ 反斜杠 · \" 双引号 · \' 单引号 · \0 空字符
其他 I/O
putchar('A'); // 输出一个字符
char ch = getchar(); // 输入一个字符
puts("hello"); // 输出字符串并自动换行
fprintf(stderr, "错误信息\n"); // 输出到标准错误