c - printf 的参数用作格式说明符的参数
问题描述
假设我有以下功能:
void fprint(float f, int ds) {
printf("%.%df\n", ds, f);
}
我希望调用者指定要打印的浮点数,以及小数点后的位数。(由说明.%d
符指示)
但是,在编译时,我收到 2 个警告:
./sprint.h: In function ‘fprint’:
./sprint.h:19:14: warning: conversion lacks type at end of format [-Wformat=]
printf("%.%df\n", ds, f);
^
和
./sprint.h:19:12: warning: too many arguments for format [-Wformat-extra-args]
printf("%.%df\n", ds, f);
^~~~~~~~~
当调用它时:fprint(3.1422223f, 3);
,它会产生输出:%df
。我还尝试在函数声明中交换参数的顺序,但它会产生相同的警告。
我的问题是:如何将格式说明符(例如%d
在这种情况下)注入现有的格式说明符?
解决方案
您可以使用星号 withprintf
来指定由参数给出的宽度或精度——无需创建动态格式字符串。
printf("%.*f", ds, f);
手册页的 printf(3):
精确
可选精度,形式为句点 (
.
),后跟可选的十进制数字字符串。 代替十进制数字字符串,可以写*
或*m$
(对于一些十进制整数 m)来指定精度分别在下一个参数或第 m 个参数中给出,它必须是 int 类型。 如果精度为 just.
,则精度为零。取负精度,就好像省略了精度一样。d
这给出了出现,i
,o
,u
,x
, 和转换的最小位数,出现在, , , ,X
的基数字符之后的位数a
A
e
E
f
, 和F
转换, 和转换的最大有效数字数,或从字符串中打印的最大字符数 forg
和转换.G
s
S
推荐阅读
- mysql - mysql Aurora中upsert的性能问题
- sql - SQL Server:基于 Json 数组中的值的 Json 列查询/选择
- spring-boot - 无法将数据作为隐藏字段从 html 发送到控制器
- python - 如何将异步函数传递给 Python 中的线程目标?
- python - Pandas - 根据列中的排序顺序拆分数据帧
- php - 调用数组上的成员函数 num_rows() 如何解决此错误
- visual-studio-code - VSCode 工作区自动包含所有子文件夹
- python - 在数据库表中加载一个 spark sql 表
- angular - 在 url 中编码的引号
- r - 在 R 中将绘图导出到 .pptx 或 .docx 时出现问题