printf的参数用作格式说明符的参数

时间:2018-07-02 16:35:06

标签: c string-formatting

假设我具有以下功能:

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插入现有的格式说明符中?)

2 个答案:

答案 0 :(得分:6)

您可以在带有printf的星号上指定由参数指定宽度或精度,而无需创建动态格式字符串。

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

手册页的printf(3):

  

精度

     

可选精度,以句点(.的形式),后跟可选的十进制数字字符串。 代替十进制数字字符串,可以写* *m$(对于十进制整数m)以指定精度在下一个参数中给出或第m个参数中的必须为int类型。如果给定的精度仅为.,则精度为零。负精度就像忽略精度一样。这给出了diouxX转换中出现的最小位数aAeEfF的基数字符后出现的最大位数gG转换的有效位数,或sS转换的字符串要打印的最大字符数。

答案 1 :(得分:0)

printf()格式的字符串不必是常量文本字符串。它也可以是字符串变量或包含格式说明符的字符数组。

char fmt[256];
int  lVal = 5;

strcpy (fmt, "this %d\n");
printf (fmt, lVal);

通过使用字符串作为格式说明符,只要提供给printf()函数的参数列表与格式字符串一致,就可以进行所需的任何修改。

您还可以通过连接格式说明符的各个部分以构建完整的格式字符串来进行快速更改,或者可以使用诸如sprintf()之类的函数来创建格式说明符字符串。