【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);     // 参数不足
相关推荐
尘觉2 天前
创作 1024 天|把热爱写成长期主义
数据库·1024程序员节
写点什么呢3 天前
Word使用记录
word·1024程序员节
开开心心就好3 天前
内存清理工具点击清理,自动间隔自启
linux·运维·服务器·安全·硬件架构·材料工程·1024程序员节
开开心心就好4 天前
内存清理工具开源免费,自动优化清理项
linux·运维·服务器·python·django·pdf·1024程序员节
张萌杰7 天前
深度学习的基础知识(常见名词解释)
人工智能·深度学习·机器学习·1024程序员节
开开心心就好8 天前
免费无广告卸载工具,轻便安全适配全用户
linux·运维·服务器·网络·安全·启发式算法·1024程序员节
开开心心就好9 天前
图片格式转换工具,右键菜单一键转换简化
linux·运维·服务器·python·django·pdf·1024程序员节
徐子童11 天前
网络协议---TCP协议
网络·网络协议·tcp/ip·面试题·1024程序员节
扫地的小何尚13 天前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
数据皮皮侠AI14 天前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节