首页 > 解决方案 > 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在这种情况下)注入现有的格式说明符?

标签: cstring-formatting

解决方案


您可以使用星号 withprintf来指定由参数给出的宽度或精度——无需创建动态格式字符串。

printf("%.*f", ds, f);

手册页的 printf(3):

精确

可选精度,形式为句点 ( .),后跟可选的十进制数字字符串。 代替十进制数字字符串,可以写**m$(对于一些十进制整数 m)来指定精度分别在下一个参数或第 m 个参数中给出,它必须是 int 类型。 如果精度为 just .,则精度为零。取负精度,就好像省略了精度一样。d这给出了出现, i, o, u, x, 和转换的最小位数,出现在, , , ,X的基数字符之后的位数aAeEf, 和F转换, 和转换的最大有效数字数,或从字符串中打印的最大字符数 forg和转换.GsS


推荐阅读