【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);     // 参数不足
相关推荐
fangzhanpeng1684 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心7 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552712 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552713 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝14 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552714 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552715 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552717 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552718 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552719 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节