【C】占位符知识点总结

占位符用在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. 注意事项

  1. 类型匹配: 确保占位符与变量类型匹配

  2. 地址传递 : scanf需要变量的地址(&运算符)

  3. 缓冲区安全: 使用字符串时注意缓冲区大小

  4. 格式顺序: 占位符顺序与参数顺序一致

  5. 特殊字符 : 注意\n, \t等转义字符的使用

8. 常见错误

objectivec 复制代码
// 错误示例
int a = 10;
printf("%f", a);        // 类型不匹配
scanf("%d", a);         // 缺少&
scanf("%s", &str);      // 数组名本身是地址,不需要&
printf("%d %d", a);     // 参数不足
相关推荐
月临水3 小时前
Git 学习笔记
笔记·git·学习·1024程序员节
春日见3 小时前
“package.xml”和“CMakeLists.txt”配置
1024程序员节
Felven4 小时前
统信系统下设置RTC时间
linux·rtc·1024程序员节
程序猿阿伟4 小时前
《3D端游开放世界动态天气系统与场景交互优化实践日志》
3d·1024程序员节
#麻辣小龙虾#4 小时前
基于transform的scale属性,实现数据可视化大屏自适应缩放适配不同分辨率
1024程序员节
2301_772093564 小时前
KVSTORE_Pain point_tuchuang_ROS2
java·开发语言·1024程序员节
cyyt5 小时前
深度学习周报(10.20~10.26)
1024程序员节
学Java的bb5 小时前
RabbitMQ-高级
1024程序员节