C语言格式化输入输出总结 (printf和scanf)
一、printf格式化输出
1. 整数格式化 (%d, %i, %u, %o, %x)
c复制代码
int num = 42;
// 以下为不同格式输出示例
printf("%d", num); // 42 (十进制)
printf("%i", num); // 42 (同%d)
printf("%u", num); // 42 (无符号十进制)
printf("%o", num); // 52 (八进制)
printf("%x", num); // 2a (小写十六进制)
printf("%X", num); // 2A (大写十六进制)
printf("%#x", num); // 0x2a (带前缀)
printf("%05d", num); // 00042 (补零)
printf("%-5d", num); // "42 " (左对齐)
printf("%+d", num); // +42 (显示符号)
2. 浮点数格式化 (%f, %e, %g)
c复制代码
double f = 3.1415926;
// 不同格式的浮点数输出示例
printf("%f", f); // 3.141593 (默认6位)
printf("%.2f", f); // 3.14 (保留2位)
printf("%8.3f", f); // " 3.142" (总宽8)
printf("%e", f); // 3.141593e+00 (科学计数)
printf("%.2E", f); // 3.14E+00
printf("%g", f); // 3.14159 (自动选择)
printf("%.3g", f); // 3.14 (最多3位有效数字)
3. 字符和字符串
c复制代码
char c = 'A';
char s[] = "Hello";
// 字符与字符串输出示例
printf("%c", c); // A
printf("%5c", c); // " A"
printf("%s", s); // Hello
printf("%.3s", s); // Hel (截断)
printf("%10s", s); // " Hello"
printf("%-10s", s); // "Hello "
二、scanf格式化输入
1. 基本输入格式
c复制代码
int a;
float b;
char c;
char str[20];// 基本类型输入示例
scanf("%d", &a); // 读取整数
scanf("%f", &b); // 读取浮点数
scanf("%c", &c); // 读取单个字符
scanf("%s", str); // 读取字符串(无空格)
2. 控制输入宽度
c复制代码
// 控制输入宽度示例
scanf("%5d", &a); // 最多读取5位数字
scanf("%4f", &b); // 最多读取4位浮点数
scanf("%10s", str); // 最多读取10个字符
3. 跳过特定输入
c复制代码
int day, month, year;
// 跳过特定输入示例
scanf("%d/%d/%d", &day, &month, &year); // 输入12/05/2023
scanf("%d - %d - %d", &day, &month, &year); // 输入12 - 05 - 2023
scanf("%*s %d", &a); // 跳过第一个字符串,读取第二个数字
4. 扫描集
c复制代码
char name[50];
// 扫描集示例
scanf("%[A - Za - z]", name); // 只读取字母
scanf("%[^\n]", str); // 读取整行(包括空格)
三、特殊格式控制
1. printf特殊格式
c复制代码
// printf特殊格式示例
printf("%p", &num); // 输出指针地址
printf("%%"); // 输出%字符
printf("%*d", 5, 10); // 宽度动态指定(5)
2. scanf特殊格式
c复制代码
int h, m, s;
// scanf特殊格式示例
scanf("%d:%d:%d", &h, &m, &s); // 输入12:30:45
scanf("%[0 - 9]", str); // 只读取数字
scanf("%*[ \t\n]%c", &c); // 跳过空白字符
四、综合示例
1. printf示例
c复制代码
#include <stdio.h>
int main() {int id = 123;float score = 89.567;char grade = 'A';// 格式化输出示例printf("学号:%05d 成绩:%6.2f 等级:%c\n", id, score, grade);// 输出: 学号:00123 成绩: 89.57 等级:Areturn 0;
}
2. scanf示例
c复制代码
#include <stdio.h>
int main() {int year;char model[20];float price;printf("输入汽车信息(年份 型号 价格): ");scanf("%d %19s %f", &year, model, &price);// 格式化输出读取的信息printf("%d年款 %s 售价: %.2f万元\n", year, model, price);return 0;
}
五、格式说明符对比
说明符 | printf用途 | scanf用途 |
---|---|---|
%d | 输出有符号十进制整数 | 读取有符号十进制整数 |
%i | 同%d | 可读取十进制/八进制/十六进制 |
%u | 输出无符号十进制整数 | 读取无符号十进制整数 |
%o | 输出八进制 | 读取八进制 |
%x/%X | 输出十六进制 | 读取十六进制 |
%f | 输出浮点数 | 读取float |
lf | 同%f (double) | 读取double |
%e/%E | 科学计数法输出 | 同%f |
%g/%G | 自动选择%f或%e | 同%f |
%c | 输出字符 | 读取字符 |
%s | 输出字符串 | 读取字符串(无空格) |
%p | 输出指针地址 | 无 |
%[] | 无 | 扫描字符集合 |
%% | 输出%字符 | 无 |
六、注意事项
1. printf和scanf参数区别
- printf传递变量值。
- scanf传递变量地址(&)。
2. 缓冲区问题
c复制代码
int a; char c;
scanf("%d", &a); // 输入后按回车
scanf("%c", &c); // 会读取之前输入的回车
// 解决方法: scanf(" %c", &c); (添加空格)
3. 安全性
- 使用scanf读取字符串时务必指定宽度:
c复制代码
char str[10];
scanf("%9s", str); // 防止缓冲区溢出
4. 返回值
- scanf返回成功读取的项目数。
c复制代码
if(scanf("%d %f", &a, &b)!= 2) {printf("输入错误!");
}
掌握这些格式化输入输出方法可以让你在C语言中更灵活地处理各种数据输入输出需求。