占位符用在printf()和scanf()
但用法有细微差别:
printf("占位符",变量名)
scanf("占位符",变量地址)
1. 基本概念
占位符是格式化输入输出函数中用于指定数据格式的特殊符号,以%开头。
2. 常用占位符分类
2.1 整数类型
| 占位符 | 描述 | 示例 |
|---|---|---|
%d |
有符号十进制整数 | int a = 10; printf("%d", a); |
%u |
无符号十进制整数 | unsigned int b = 20; printf("%u", b); |
%o |
无符号八进制整数 | printf("%o", 10); // 输出12 |
%x/%X |
无符号十六进制整数(小写/大写) | printf("%x", 255); // 输出ff |
%ld |
长整型 | long c = 100L; printf("%ld", c); |
%lld |
长长整型 | long long d = 1000LL; printf("%lld", d); |
2.2 浮点数类型
| 占位符 | 描述 | 示例 |
|---|---|---|
%f |
单精度浮点数 | float e = 3.14f; printf("%f", e); |
%lf |
双精度浮点数 | double f = 3.14159; printf("%lf", f); |
%e/%E |
科学计数法(小写e/大写E) | printf("%e", 123.456); |
%g/%G |
自动选择%f或%e中较短者 | printf("%g", 0.0000123); |
2.3 字符和字符串
| 占位符 | 描述 | 示例 |
|---|---|---|
%c |
单个字符 | char ch = 'A'; printf("%c", ch); |
%s |
字符串 | char str[] = "hello"; printf("%s", str); |
2.4 指针类型
| 占位符 | 描述 | 示例 |
|---|---|---|
%p |
指针地址 | int x; printf("%p", &x); |
3. 格式修饰符
3.1 宽度和精度
objectivec
// 宽度控制
printf("%5d", 10); // " 10" (右对齐,宽度5)
printf("%-5d", 10); // "10 " (左对齐,宽度5)
// 精度控制
printf("%.2f", 3.14159); // "3.14" (保留2位小数)
printf("%5.2f", 3.14159); // " 3.14" (宽度5,保留2位小数)
// 字符串精度
printf("%.3s", "hello"); // "hel" (只输出前3个字符)
3.2 其他修饰符
objectivec
// 前导零
printf("%05d", 12); // "00012"
// 显示正负号
printf("%+d", 10); // "+10"
// 空格代替加号
printf("% d", 10); // " 10"
4. 特殊占位符
objectivec
// 输出%本身
printf("折扣: 20%%"); // "折扣: 20%"
// %n - 记录已输出的字符数
int count;
printf("hello%n", &count);
printf(" 字符数: %d", count); // "字符数: 5"
注:输出%本身要再加一个%
注:%n还是第一次见:
printf("hello%n", &count); 执行时:
-
输出字符串 "hello"(5个字符)
-
遇到
%n时,它会将到目前为止已输出的字符数 写入到&count指向的变量中 -
所以
count被赋值为 5
5. scanf中的占位符
5.1 基本用法
objectivec
int num;
float fnum;
char ch;
char str[20];
scanf("%d", &num); // 读取整数
scanf("%f", &fnum); // 读取浮点数
scanf(" %c", &ch); // 读取字符(注意空格跳过空白符)
scanf("%s", str); // 读取字符串
5.2 宽度限制
objectivec
// 限制输入字符数,防止缓冲区溢出
char name[11];
scanf("%10s", name); // 最多读取10个字符
5.3 扫描集
objectivec
char str[50];
// 只读取小写字母
scanf("%[a-z]", str);
// 读取除换行外的所有字符
scanf("%[^\n]", str);
6. 实用示例
objectivec
#include <stdio.h>
int main() {
// 综合示例
int age = 25;
float salary = 12345.67;
char grade = 'A';
char name[] = "张三";
printf("姓名: %-10s 年龄: %03d\n", name, age);
printf("薪资: %.2f 等级: %c\n", salary, grade);
printf("十六进制年龄: 0x%X\n", age);
// 表格输出
printf("\n%-10s %-8s %-10s\n", "姓名", "年龄", "薪资");
printf("%-10s %-8d %-10.2f\n", name, age, salary);
return 0;
}
输出结果:

7. 注意事项
-
类型匹配: 确保占位符与变量类型匹配
-
地址传递 : scanf需要变量的地址(
&运算符) -
缓冲区安全: 使用字符串时注意缓冲区大小
-
格式顺序: 占位符顺序与参数顺序一致
-
特殊字符 : 注意
\n,\t等转义字符的使用
8. 常见错误
objectivec
// 错误示例
int a = 10;
printf("%f", a); // 类型不匹配
scanf("%d", a); // 缺少&
scanf("%s", &str); // 数组名本身是地址,不需要&
printf("%d %d", a); // 参数不足