首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >书写十四行诗的精髓——C语言printf格式化输出语句

书写十四行诗的精髓——C语言printf格式化输出语句

作者头像
枫亭湖区
发布2025-11-13 09:05:54
发布2025-11-13 09:05:54
40
举报
printf格式化输出

前言

在这里插入图片描述
在这里插入图片描述

且看上面的诗歌水墨画,画中的诗词以一定的格式排版在山水画的上方,与山水融为一体 这便是格式化排版带来的效果,我们也可以将这个方法应用于我们的代码输出中,使我们输出的代码更加整齐规律

printf格式化输出

printf是C标准库中最核心的输出函数,其格式化功能极其丰富。

下面将分别从八个维度讲解

(1)printf 格式说明符完整表格

整数类格式说明符

格式符

说明

对应数据类型

示例

%d

有符号十进制整数

int

printf("%d", 42)

%i

有符号十进制整数(同%d)

int

printf("%i", 42)

%u

无符号十进制整数

unsigned int

printf("%u", 42u)

%o

无符号八进制整数

unsigned int

printf("%o", 42)

%x

无符号十六进制(小写)

unsigned int

printf("%x", 255)→"ff"

%X

无符号十六进制(大写)

unsigned int

printf("%X", 255)→"FF"

%hd

短整型十进制

short

printf("%hd", (short)42)

%ld

长整型十进制

long

printf("%ld", 42L)

%lld

长长整型十进制

long long

printf("%lld", 42LL)

%zu

size_t类型无符号十进制

size_t

printf("%zu", sizeof(int))

浮点类格式说明符

格式符

说明

对应数据类型

示例

%f

十进制小数表示

float/double

printf("%f", 3.14)

%F

同%f但INF/NAN大写

float/double

printf("%F", INFINITY)→"INF"

%e

科学计数法(小写e)

float/double

printf("%e", 314.0)→"3.140000e+02"

%E

科学计数法(大写E)

float/double

printf("%E", 314.0)→"3.140000E+02"

%g

自动选择%f或%e(更紧凑)

float/double

printf("%g", 3.14000)→"3.14"

%G

自动选择%F或%E(大写)

float/double

printf("%G", 314.0)→"314"

%a

十六进制浮点(小写)

float/double(C99)

printf("%a", 3.14)→"0x1.91eb86p+1"

%A

十六进制浮点(大写)

float/double(C99)

printf("%A", 3.14)→"0X1.91EB86P+1"

字符类格式说明符

格式符

说明

对应数据类型

示例

%c

单个字符

char

printf("%c", 'A')

%lc

宽字符

wchar_t

printf("%lc", L'中')

%s

字符串

char*

printf("%s", "hello")

%ls

宽字符串

wchar_t*

printf("%ls", L"中文")

指针类格式说明符

格式符

说明

对应数据类型

示例

%p

指针地址(十六进制)

void*

printf("%p", &var)→"0x7ffeeb39a82c"

%n

存储已写字符数

int*

int cnt; printf("123%n", &cnt);→cnt=3

(2)printf 宽度(width)控制

(2.1)静态指定
代码语言:javascript
复制
printf("%10d", 123);  // "       123"
(2.2)动态指定:
动态指定宽度(width)的语法
代码语言:javascript
复制
printf("%*[其他格式]", width_value, data);
  • 作为占位符,表示宽度值将从参数列表中获取
  • 参数顺序:宽度值必须直接出现在要格式化的数据之前

代码示例:

代码语言:javascript
复制
int w = 8;
printf("%*d", w, 123); // "     123"
(2.3)最小宽度规则:
  • 实际宽度 > 指定宽度:按实际输出
  • 实际宽度 < 指定宽度:默认右对齐填充空格

简单来讲就是在 C 语言的 printf 格式化输出中,宽度(width) 用于控制输出的最小占位宽度。其核心规则是:当数据实际宽度 ≥ 指定宽度时,按实际宽度输出;当数据实际宽度 < 指定宽度时,按指定宽度填充。

(3)标志位flags讲解

标志

作用

示例

输出示例

适用格式说明符

-

左对齐

%-10s

"Hello "

所有数值和字符串格式

+

强制显示正负号

%+d

"+123"

有符号数值(d,i,f等)

空格

正数前保留空格

% d

" 123"

有符号数值

#

显示进制前缀

%#x

"0x7b"

o,x,X,a,A,f,F,e,E,g,G

0

用零填充数字宽度

%08d

"00000123"

所有数值格式

补充说明:
  1. 组合使用:可以组合多个标志,如 %+-10d 表示左对齐、显示符号、宽度10
  2. 优先级0- 同时存在时,- 会覆盖 0(如 %-08d 会按左对齐用空格填充)
  3. 特殊行为
    • # 在浮点数中会强制输出小数点(即使没有小数部分)
    • #g/G 格式中会保留尾随的零
  4. 不适用情况
    • + 和空格对无符号数(u,o,x)无效
    • 0 对字符串(s)无效

(4)精度(precision)控制

(4.1)整数
代码语言:javascript
复制
printf("%.5d", 123); // "00123"(前导零)
(4.2)浮点数
代码语言:javascript
复制
printf("%.2f", 3.14159); // "3.14"
(4.3)字符串
代码语言:javascript
复制
printf("%.5s", "HelloWorld"); // "Hello"
(4.4)动态精度
代码语言:javascript
复制
int p = 3;
printf("%.*f", p, 3.14159); // "3.142"

(5)长度修饰符(length)

修饰符

适用类型

说明

示例

输出示例(假设值为42)

hh

char

有符号字符型

printf("%hhd", c)

42

h

short

短整型

printf("%hd", s)

42

l

long

长整型

printf("%ld", l)

42

ll

long long

长长整型

printf("%lld", ll)

42

L

long double

长双精度浮点

printf("%Lf", ld)

42.000000

z

size_t

大小类型(无符号)

printf("%zu", sz)

42

t

ptrdiff_t

指针差值类型

printf("%td", pt)

42

j

intmax_t

最大宽度整数类型

printf("%jd", j)

42

使用说明:

组合规则

  • 必须与格式说明符正确匹配(如%ld对应long%lf对应double
  • L专用于long double(如%Lf

平台差异

代码语言:javascript
复制
// 32位系统:long=4字节,64位系统:long=8字节
printf("%ld", sizeof(long)); 

(6)特殊格式说明

(6.1)打印%本身:
代码语言:javascript
复制
printf("%%"); // "%"
(6.2)本地化千位分隔符:
代码语言:javascript
复制
printf("%'d", 1234567); // "1,234,567"(依赖locale)

(7)类型转换总结表

格式说明符

合法输入类型

非法输入类型

风险等级

典型错误示例

%d

int, char, short

float, long

printf("%d", 3.14f);

%ld

long

int, double

printf("%ld", 42);

%lld

long long

int, float

printf("%lld", 100);

%u

unsigned int

float, 指针

printf("%u", -1);

%f

double, float

int, long

printf("%f", 42);

%Lf

long double

double, int

printf("%Lf", 3.14);

%p

任何指针类型

非指针类型

printf("%p", 123);

%s

char* (NUL结尾)

int, float

崩溃风险

printf("%s", 0x1234);

%c

int (0-255), char

float, char*

printf("%c", "A");

%x/%X

unsigned int

有符号整数

printf("%x", -1);

风险等级说明:
  • :必然导致未定义行为(数据错乱/程序崩溃)
  • :可能引发逻辑错误但不一定崩溃
  • 崩溃风险:极大概率导致段错误(segmentation fault)
安全建议:

使用静态分析工具检查格式字符串:

代码语言:javascript
复制
gcc -Wformat -Wformat-security

(8)参数重用

(8.1)参数重用的基本语法

在格式字符串中使用 %n$ 指定参数位置(n从1开始):

代码语言:javascript
复制
printf("%2$d %1$d", a, b);  // 先输出b,再输出a
(8.2)关键特性

特性

说明

示例

输出示例(假设参数为"Hello", 123)

位置指定

通过%n$指定参数位置(n从1开始)

printf("%2$s %1$d", 123, "Hello")

"Hello 123"

混合使用

可与普通格式说明符混合使用

printf("%s %2$d", "Num:", 42)

"Num: 42"

重复使用

单个参数可被多次引用

printf("%1$s %1$s", "Hi")

"Hi Hi"

动态宽度

结合*实现动态宽度/精度

printf("%1$*2$d", 5, 8)

" 5"(宽度8)

顺序重置

使用%n$后后续参数需重新编号

printf("%2$d %d", 1, 2)

"2 1"(第二个%d复用第1个参数)

小编附言

希望通过这八个维度能够让大家更好去了解printf的输出方法

看到这里麻烦给个三连支持一下小编

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • printf格式化输出
  • 前言
  • printf格式化输出
    • (1)printf 格式说明符完整表格
      • 整数类格式说明符
      • 浮点类格式说明符
      • 字符类格式说明符
      • 指针类格式说明符
    • (2)printf 宽度(width)控制
      • (2.1)静态指定
      • (2.2)动态指定:
      • (2.3)最小宽度规则:
    • (3)标志位flags讲解
      • 补充说明:
    • (4)精度(precision)控制
      • (4.1)整数
      • (4.2)浮点数
      • (4.3)字符串
      • (4.4)动态精度
    • (5)长度修饰符(length)
      • 使用说明:
    • (6)特殊格式说明
      • (6.1)打印%本身:
      • (6.2)本地化千位分隔符:
    • (7)类型转换总结表
      • 风险等级说明:
      • 安全建议:
    • (8)参数重用
      • (8.1)参数重用的基本语法
      • (8.2)关键特性
  • 小编附言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档