当前位置: 首页 > 知识库问答 >
问题:

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

鲜于德业
2023-03-14

假设我有以下功能:

void fprint(float f, int ds) {
    printf("%.%df\n", ds, f);
}

我希望调用者指定要打印的浮点数,以及小数点后的位数。(由<代码>表示)。%d说明符)

然而,在编译此代码时,我收到两个警告:

./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);
            ^~~~~~~~~

我的问题是:如何将格式说明符(例如本例中的%d)注入现有格式说明符?

共有2个答案

赵征
2023-03-14

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

char fmt[256];
int  lVal = 5;

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

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

您还可以通过连接格式说明符的片段来进行快速更改,以构建完整的格式字符串,也可以使用sprintf()等函数来构建格式说明器字符串。

周翰池
2023-03-14

您可以将星号与 printf 一起使用,以指定由参数给出的宽度或精度,而无需创建动态格式字符串

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

手册页的printf(3):

可选的精度,以句点(< code >)的形式表示。)后跟可选的十进制数字字符串。除了十进制数字字符串,还可以编写< code>*或< code>*m$(对于某个十进制整数m)来指定精度分别在下一个参数或第m个参数中给出,这两个参数必须是int类型。如果精度给定为< code >。中,精度为零。如果忽略了精度,则精度为负。这为< code>d 、< code>i 、< code>o 、< code>u 、< code>x和< code>X转换提供了出现的最少位数,为< code>a 、< code>A 、< code>e 、< code>E 、< code>f和< code>F提供了出现在基数字符之后的位数

 类似资料: