printf转换说明的可选项

本文详细介绍了printf函数的各种格式化选项及其使用方法,包括对齐方式、填充字符、宽度指定、精度控制等,并列举了常用的转换字符及其应用场景。

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

表 25.1. printf转换说明的可选项

选项描述举例
#八进制前面加0(转换字符为o),十六进制前面加0x(转换字符为x)或0X(转换字符为X)。printf("%#x", 0xff)打印0xffprintf("%x", 0xff)打印ff
-格式化后的内容居左,右边可以留空格。见下面的例子
宽度用一个整数指定格式化后的最小长度,如果格式化后的内容没有这么长,可以在左边留空格,如果前面指定了-号就在右边留空格。宽度有一种特别的形式,不指定整数值而是写成一个*号,表示取一个int型参数作为宽度。printf("-%10s-", "hello")打印-␣␣␣␣␣hello-printf("-%-*s-", 10, "hello")打印-hello␣␣␣␣␣-
.用于分隔上一条提到的最小长度和下一条要讲的精度。见下面的例子
精度用一个整数表示精度,对于字符串来说指定了格式化后保留的最大长度,对于浮点数来说指定了格式化后小数点右边的位数,对于整数来说指定了格式化后的最小位数。精度也可以不指定整数值而是写成一个*号,表示取下一个int型参数作为精度。printf("%.4s", "hello")打印hellprintf("-%6.4d-", 100)打印-␣␣0100-printf("-%*.*f-", 8, 4, 3.14)打印-␣␣3.1400-
字长对于整型参数,hhhlll分别表示是charshortlonglong long型的字长,至于是有符号数还是无符号数则取决于转换字符;对于浮点型参数,L表示long double型的字长。printf("%hhd", 255)打印-1

常用的转换字符有:

表 25.2. printf的转换字符

转换字符描述举例
d iint型参数格式化成有符号十进制表示,如果格式化后的位数小于指定的精度,就在左边补0。printf("%.4d", 100)打印0100
o u x Xunsigned int型参数格式化成无符号八进制(o)、十进制(u)、十六进制(x或X)表示,x表示十六进制数字用小写abcdef,X表示十六进制数字用大写ABCDEF,如果格式化后的位数小于指定的精度,就在左边补0。printf("%#X", 0xdeadbeef)打印0XDEADBEEFprintf("%hhu", -1)打印255
cint型参数转换成unsigned char型,格式化成对应的ASCII码字符。printf("%c", 256+'A')打印A
sconst char *型参数所指向的字符串格式化输出,遇到'\0'结束,或者达到指定的最大长度(精度)结束。printf("%.4s", "hello")打印hell
pvoid *型参数格式化成十六进制表示。相当于%#xprintf("%p", main)打印main函数的首地址0x80483c4
fdouble型参数格式化成[-]ddd.ddd这样的格式,小数点后的默认精度是6位。printf("%f", 3.14)打印3.140000printf("%f", 0.00000314)打印0.000003
e Edouble型参数格式化成[-]d.ddde±dd(转换字符是e)或[-]d.dddE±dd(转换字符是E)这样的格式,小数点后的默认精度是6位,指数至少是两位。printf("%e", 3.14)打印3.140000e+00
g Gdouble型参数格式化,精度是指有效数字而非小数点后的数字,默认精度是6。如果指数小于-4或大于等于精度就按%e(转换字符是g)或%E(转换字符是G)格式化,否则按%f格式化。小数部分的末尾0去掉,如果没有小数部分,小数点也去掉。printf("%g", 3.00)打印3printf("%g", 0.00001234567)打印1.23457e-05
%格式化成一个%printf("%%")打印一个%


### 使用 `printf` 函数打印 ADC 转换结果 为了在嵌入式系统中通过 `printf` 打印 ADC 的转换结果,通常需要配置系统的标准输出重定向到特定的通信接口(如 UART)。STM32 平台下可以利用 HAL 库简化这一过程。 #### 配置 USART 和重定义 `_write` 函数 要使 `printf` 正常工作,需先初始化 USART 接口,并实现 `_write` 函数来处理字符流。这可以通过修改 `syscalls.c` 或者创建自定义文件完成[^3]: ```c #include "stm32f4xx_hal.h" int _write(int file, char *ptr, int len) { HAL_UART_Transmit(&huart1, (uint8_t *) ptr, len, 0xFFFF); return len; } ``` 此代码片段展示了如何将写操作映射至指定的硬件串行端口(这里假设为 huart1),从而允许 `printf` 输出信息给外部设备。 #### 获取并展示 ADC 值 一旦完成了上述设置,在主循环或其他适当位置调用获取 ADC 数据的功能,并将其格式化后发送出去即可。下面是一个例子说明怎样读取 ADC 数字量以及计算对应的模拟电压值: ```c while (1) { uint16_t ADC_ConvertedValue = ADC_GetValue(); // 假设已存在该函数用于返回最新一次ADC采样结果 float ADC_Vol = ((float) ADC_ConvertedValue / 4096) * 3.3; printf("The current AD value = 0x%04X \r\n", ADC_ConvertedValue); printf("The current AD value = %.2f V \r\n\r\n", ADC_Vol); HAL_Delay(1000); // 添加延时以便观察变化趋势 } ``` 这段程序会周期性地采集当前通道上的信号强度,并以十六进制形式呈现原始数值;同时也会基于满刻度范围内的线性关系给出近似的真实电平表示。 #### 注意事项 - **缓冲区溢出风险**:确保传递给 `printf` 的字符串长度不会超出目标接收器所能容纳的最大限度。 - **阻塞特性**:默认情况下,HAL 库中的传输函数是同步执行的,这意味着它们会在数据完全发出之前一直等待。对于实时应用来说可能不是最佳选择,因此考虑采用中断驱动的方式提高效率。 - **浮点数支持**:如果项目启用了浮点运算,则需要注意链接选项里是否包含了必要的库文件,否则可能会遇到编译错误或者运行时异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值