【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);     // 参数不足
相关推荐
开开心心就好7 小时前
近200个工具的电脑故障修复合集
安全·智能手机·pdf·电脑·consul·memcache·1024程序员节
数据皮皮侠AI2 天前
中国城市可再生能源数据集(2005-2021)|顶刊 Sci Data 11 种能源面板
大数据·人工智能·笔记·能源·1024程序员节
计算机毕业论文辅导5 天前
物联网实战:基于MQTT协议的智能家居数据传输系统设计与实现
1024程序员节
开开心心就好5 天前
支持批量处理的视频分割工具推荐
安全·智能手机·rust·pdf·电脑·1024程序员节·lavarel
liuyao_xianhui7 天前
Linux开发工具结尾 _make
linux·运维·服务器·数据结构·哈希算法·宽度优先·1024程序员节
学传打活9 天前
【边打字.边学昆仑正义文化】_21_爱的结晶(1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
数据皮皮侠AI16 天前
顶刊同款!中国地级市风灾风险与损失数据集(2000-2022)|灾害 / 环境 / 经济研究必备
大数据·人工智能·笔记·能源·1024程序员节
Fab1an17 天前
Busqueda——Hack The Box 靶机
linux·服务器·学习·1024程序员节
技术专家18 天前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
学传打活20 天前
古代汉语是源,现代汉语是流,源与流一脉相承。
微信公众平台·1024程序员节·汉字·中华文化