printf使用占位符控制输出格式

本文详细解读printf()函数的使用,包括基本语法、复杂占位符的说明符及其在输出中的应用,从整数、浮点数到字符串的格式化示例。掌握这些技巧,提升字符操作和控制输出的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

printf()函数提供丰富的占位符参数以便精细地控制输出格式,再进行字符操作的时候我们可能会使用到sprintf类函数进行处理,因此这里对printf()函数的格式化输出控制进行较为“详细”讨论。

简单的printf()语法

//Project - Variable
#include <stdio.h>

int main(){
    int n = 3;
    float fPrice = 3.6;
    float fAmount = n*fPrice;
    float fMoney = 20;
    fMoney = fMoney - fAmount;
    printf("%d apples, %.1f for each, %.2f in total.\n",n,fPrice,fAmount);
    printf("20 - %.2f = %.2f.",fAmount,fMoney);
    return 0;
}

上述代码执行结果如下:

3 apples, 3.6 for each, 10.80 in total.
20 - 10.80 = 9.20.

printf占位符解析
上述程序及上图展示了通过printf()进行格式化输出的最基本方法。程序中的printf( )函数共有4个参数,其中,第1个参数由双引号包裹,是一个字符串。该字符串中包含了三个占位符(place holder),在格式化输出过程中,这些占位符将依次由后续参数的值替换。图1展示了该行的各占位符、参数与输出文本之间的对应关系。

printf()函数可以接受多个参数,其第1个参数预期为一个字符串,该字符串中的占位符个数以及要求的类型应与后续其他参数相匹配,否则会产生错误。最简单的占位符由一个%加上一个specifier说明符构成,specifier说明符详见下表。

运用复杂占位符进行格式化输出

一个完整的占位符格式如下,其中,[ ]表示其中的内容为可选项。在下述格式中,从前住后依次是%标志(flags)输出宽度(width)精度(.precision)类型长度(length)以及说明符(specifier)。其中,%以及末尾的specifier都是必需的。

%[flags][width][.precision][length]specifier

specifier说明符处于一个占位符的末尾,是占位符不可或缺的组成部分,它定义了printf()函数以何种类型来解释和输出与占位符匹配的参数。

specifier/说明符输出示例
d或i有符号的十进制整数827
u无符号的十进制整数2353
o无符号八进制整数621
x无符号十六进制整数(小写)2fb
X无符号十六进制整数(大写)2FB
f或F十进制浮点小数(小写)792.45
e科学计数法(小写)7.9245e+2
E科学计数法(大写)7.9245E+2
g以%e或%f中的较短格式输出浮点数792.45
G以%E或%F中的较短格式输出浮点数792.45
a十六进制浮点数(小写)0xd.1f
A十六进制浮点数(大写)0XD.1F
c单个字符z
s字符串hello
p指针(地址)c280000000000000
n输出计数格式化输出内容为空。当前为止已格式化输出的字符总数将存储在对应的参数中,该对应参数的类型应为int*。
%两个连续的%%将会在输出结果中产生一个%。%
flags/标识描述
-在给定的输出宽度中左对齐,默认右对齐
+对于正数,前置一个+号,对负数,前置一个-号。默认情况下,负数前置一个-号,正数前无+号。
(空格)如果数值前无符号位,插入一个空格在数值前。
#与%o, %x, %X配用时,在数值前分别附加0, 0x, 0X…
0当给定输出宽度时,如果数字的字符数不够,左边补0而不是空格。
width/输出宽度描述
(number)格式化输出的最小字符宽度。如果值格式化后的宽度小于指定宽度,则以空格填充。如果值格式化后实际宽度大于指定宽度,按实际值输出。
**号表示宽度值未在格式字符串中给出,而是作为一个附加的整数值列于被格式化输出的参数之前。
.precision/精度描述
.number对于整型说明符(d, i, o, u, x, X),该精度给出了最小的输出位数大小。如果实际值小于指定位数,则在前面补0。如果实际值位数大于指定位数,按实际值输出。如果指定精度为0,意为对于值0,格式化输出结果为空。 对于a,A,e,E,f和F等浮点数输出格式,该精度值给出了小数点后的位数(默认为6)。对于g和G输出格式,该精度值规定了最大输出位数。对于s输出格式,该精度值规定了最大输出字符数。默认情况下,以0结尾的C风格字符串中的全部字符都会被输出,直到遇到表示末尾的0值字符。
**号表示精度值未在格式字符串中给出,而是作为一个附加的整数值列于被格式化输出的参数之前。

类型长度(length)项用于表示数据类型的长度。上表列出了当不同的[length]项与不同的[specifier]合用时所对应的输出参数的数据类型。

length/长度d iu o x Xf F e E g G a Acspn
(none)intunsigned intdoubleintchar*void*int*
hhsigned charunsigned charsigned char*
hshort intunsigned short intshort int*
llong intunsigned long intwint_twchar_t*long int*
lllong long intunsigned long long intlong long int*
jintmax_tuintmax_tintmax_t*
zsize_tsize_tsize_t*
tptrdiff_tptrdiff_tptrdiff_t*
Llong double

示例

格式化输出整数

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>

int main(){
    int i = 346, j = -346;
    printf("i = |%+d|, j = |%d|\n",i,j);
    printf("i = |%015d|, j = |%+15d|\n",i,j);
    return 0;
}

执行结果为:

i = |+346|, j = |-346|
i = |000000000000346|, j = |           -346|

格式化输出浮点数

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>

int main(){
    double f = 3.1415926;
    double d = -314.15926535798932;
    printf("f = |%+f|, d = |%f|\n",f,d);
    printf("f = |%-15.3f|, d = |%+15.2f|\n",f,d);
    return 0;
}

执行结果为:

f = |+3.141593|, d = |-314.159265|
f = |3.142          |, d = |        -314.16|

格式化输出字符串

示例中为方便观察,使用| |来标识输出宽度。

#include <stdio.h>

int main(){
    char s[] = "tomcat";
    printf("|%s|\n",s);
    printf("|%30s|\n",s);
    printf("|%-30s|",s);
    return 0;
}

执行结果为:

|tomcat|
|                        tomcat|
|tomcat                        |

参考资料:

  1. Cpp printf

转自

  1. printf()使用占位符精细控制输出格式–海洋饼干叔叔
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值