当前位置: 首页 > news >正文

C语言中的格式输出

在 C 语言的 printf 中,% 后面跟着的字符(或字符序列)叫做格式说明符,它告诉 printf 如何解释要输出的数据以及以什么形式显示。

要彻底搞明白,你需要理解三部分:

  1. 基本格式字符(如 d, f, s)—— 决定数据的类型和显示方式
  2. 可选修饰符(如数字、小数点、-, + 等)—— 控制宽度、精度、对齐等格式。
  3. 长度修饰符(如 l, h, z)—— 处理不同长度的整数或浮点数。

下面我会由浅入深讲解,并附上例子。


一、如何确定 % 后面的字母(基本格式字符)

原则:根据你要输出的变量类型想要的显示格式来选择。

你想要输出的数据 变量类型(举例) 常用格式字符 说明
整数(十进制) int, short, long di %d 最常用
无符号整数(十进制) unsigned int u
八进制整数 任意整数类型 o 不带前导0
十六进制整数 任意整数类型 xX %x 输出小写字母,%X 输出大写
浮点数(小数形式) float, double f 默认小数点后6位
浮点数(科学计数法) float, double eE 1.23e+02
浮点数(自动选 fe float, double gG 更简洁
单个字符 char c
字符串 char* s
指针地址 任意指针 p 输出十六进制地址
百分号本身 %% 输出 % 字符

举例

int a = 42;
float b = 3.14159;
char c = 'A';
char* str = "Hello";printf("%d\n", a);   // 输出 42
printf("%f\n", b);   // 输出 3.141590
printf("%c\n", c);   // 输出 A
printf("%s\n", str); // 输出 Hello

注意:在 printf 中,float 参数会自动转换为 double,所以 %f%lf 对于 double 都可以用(但 %lf 更准确)。不过为了清晰,建议 double%f(老标准要求 %lf,但现代 C 允许 %f 两者通用,最好查编译器文档)。通常初学者记住 %f 输出浮点数就行。


二、为什么有时候 % 后面还带数字?

数字用于控制输出宽度精度,它们都是可选的。

1. 最小宽度(整数)

格式:%[数字] 字母
例:%5d 表示输出的整数至少占 5 个字符宽度,如果实际数字位数不足,默认在左边补空格(右对齐)。

printf("%5d\n", 42);   // 输出 "   42"(前面3个空格)
printf("%5d\n", 12345); // 输出 "12345"(宽度刚好)

2. 精度(小数点后位数)

格式:%.[数字] 字母
例:%.2f 表示浮点数保留小数点后 2 位(会四舍五入)。

printf("%.2f\n", 3.14159); // 输出 "3.14"
printf("%.0f\n", 3.14159); // 输出 "3"(无小数部分)

对于整数,精度控制输出的最少位数,不足则在左边补零:

printf("%.5d\n", 42); // 输出 "00042"

3. 同时使用宽度和精度

格式:%[宽度].[精度] 字母
例:%8.2f 表示总宽度至少 8 个字符(含小数点和小数部分),小数部分 2 位。

printf("%8.2f\n", 3.14159); // 输出 "    3.14"(前面4个空格)

4. 其他标志符

在宽度/精度前还可以加标志:

  • - :左对齐(默认右对齐)
    %-5d 输出 42 (右边补空格)
  • + :强制显示正号
    %+d 输出 +42
  • 0 :宽度不足时左边补零(仅对数值有效)
    %05d 输出 00042
  • 空格 :正数前显示空格,负数显示负号
    % d 输出 42(前面有空格)

三、长度修饰符(处理不同大小的整数或浮点数)

当变量类型不是默认的 intdouble 时,需要在格式字符前加长度修饰符。

修饰符 适用于 例子
l (小写L) long, unsigned long %ld, %lu
ll long long %lld, %llu
h short %hd
hh signed char / unsigned char %hhd
z size_t (无符号整数) %zu
L long double %Lf
long big = 100000L;
printf("%ld\n", big);short small = 10;
printf("%hd\n", small);long double ld = 3.14159265358979L;
printf("%Lf\n", ld);  // 注意是大写 L

注意:在 printf 中,float 会自动提升为 double,所以 %f%lfdouble 都有效,但 %lf 更规范。对于 long double 必须用 %Lf


四、完整的格式说明符语法

% [标志] [最小宽度] [.精度] [长度修饰符] 格式字符

其中方括号表示可选,顺序必须按上面来。

例子

printf("%-+10.3lf\n", 3.14159);
  • - 左对齐
  • + 显示正号
  • 10 最小宽度10
  • .3 精度3位小数
  • l 长度修饰符(long double 实际上应该是 L,这里故意写错演示语法位置,正确应为 %+-10.3Lf
  • f 浮点数

输出:+3.142 (左对齐,总宽10,正号,四舍五入到3位)


五、如何记住并选择?

简单口诀

  • 整数 → d(十进制)或 x/o(其他进制)
  • 浮点数 → f(小数)或 e(科学记数)
  • 字符 → c
  • 字符串 → s
  • 想加宽、补零、控制小数位 → 加数字和点
  • 遇到 longshortlong long → 加 lhll

实际使用建议

  1. 不确定时,先用 %d%f 看编译器警告(许多编译器会提示类型不匹配)。
  2. 打印地址用 %p,不要用 %x(虽然也能工作,但不规范)。
  3. 打印 size_t%zu(它是 unsigned long longunsigned long 的别名)。

六、完整示例程序

#include <stdio.h>int main() {int a = 42;float b = 3.14159;double c = 2.71828;char d = 'X';char* e = "Hello, world!";long f = 123456789L;unsigned int g = 40000;printf("整数: %d\n", a);printf("浮点数(默认6位): %f\n", b);printf("浮点数(2位小数): %.2f\n", b);printf("浮点数(宽8, 3位小数): %8.3f\n", c);printf("字符: %c\n", d);printf("字符串: %s\n", e);printf("长整数: %ld\n", f);printf("无符号整数: %u\n", g);printf("十六进制(小写): %x\n", a);printf("十六进制(大写): %X\n", a);printf("左对齐宽5: %-5d|\n", a);printf("补零宽5: %05d\n", a);printf("带正号: %+d\n", a);return 0;
}

输出

整数: 42
浮点数(默认6位): 3.141590
浮点数(2位小数): 3.14
浮点数(宽8, 3位小数):    2.718
字符: X
字符串: Hello, world!
长整数: 123456789
无符号整数: 40000
十六进制(小写): 2a
十六进制(大写): 2A
左对齐宽5: 42   |
补零宽5: 00042
带正号: +42

总结:% 后面的字母由数据类型和显示需求决定,数字用来修饰宽度和精度,修饰符处理特殊长度

http://www.jsqmd.com/news/612001/

相关文章:

  • OpenClaw硬件加速:在NVIDIA显卡上优化Kimi-VL-A3B-Thinking推理速度
  • FireRed-OCR Studio详细步骤:Streamlit缓存机制@st.cache_resource性能实测
  • 蒸汽管道工程关键要点全解析
  • 破解微信小程序加密包:wxappUnpacker逆向工程实战指南
  • 保姆级教学:用Flux2 Klein LoRA在ComfyUI里实现动漫转真人
  • 2026年,成都那些备受赞誉、口碑爆棚的代理记账公司究竟啥样? - 红客云(官方)
  • [Python3高阶编程] - Gunicorn 源代码阅读六:Gunicorn是如何实现 Worker 进程的超时检测机制(WorkerTmp)
  • 告别硬编码!SAP ABAP动态调用Function Module实战:基于FUPARAREF表的参数自动解析
  • FreakStudio慷
  • 3个高效重置技巧:让你的JetBrains IDE试用期无忧延长全平台指南
  • Llama 4完全免费开源:4000亿参数零门槛,普通打工人的AI翻身窗口来了
  • 无转子硫化仪哪家实力强?深度评估来了 - 品牌推荐大师1
  • [Python3高阶编程] - Gunicorn 源代码阅读七:深入理解协议与 I/O 层(HTTP 解析 + Socket 管理)
  • 南邮计科电工电子B《交流参数测量》实验报告
  • NCM格式转换技术指南:突破加密限制实现音频自由播放
  • 超越传统OCR:Ostrakon-VL-8B理解复杂文档与表格的实战效果
  • 微量残炭测定仪工作原理
  • 【毕业设计】文理医院预约挂号系统的设计与实现
  • 工业传感器国产替代新突破:闭环霍尔传感器的技术突围与市场机遇
  • OpenClaw多模态任务实战:Qwen2.5-VL-7B处理图文内容
  • Qwen3-ASR-1.7B问题解决:遇到WAV格式错误、识别慢怎么办?
  • https://www.voscreen.com/ 是一个非常好的学习英语的网站,请判断和总结它是怎样实现的?如果想复刻一个该网站,需要怎么做?
  • 业务/数据/应用/技术解析
  • M2FP人体解析5分钟快速部署:无需GPU,小白也能玩转多人分割
  • Ollama部署Granite-4.0-H-350m实战教程:从零开始,快速体验AI对话
  • DOL-Lyra构建系统:自动化游戏MOD整合解决方案
  • Qwen2.5-0.5B-Instruct实测:这个5亿参数小模型,网页对话效果有多强?
  • 【内部泄露文档编号:PYAOT-2026-SEC-ALPHA】:Python AOT插件真实下载源、安装时绕过PyPI限流的5种合法方式(含企业级部署模板)
  • 千问3.5-9B目标检测技术演进解读:从YOLOv5到YOLOv11
  • 4月10日新规落地!自媒体5条合规红线,慎踩避免限流封号