假设我有以下功能:
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
)注入现有格式说明符?
printf()
格式字符串不需要是常量文本字符串。它也可以是字符串变量或包含格式说明符的字符数组。
char fmt[256];
int lVal = 5;
strcpy (fmt, "this %d\n");
printf (fmt, lVal);
通过对格式说明符使用字符串,只要提供给printf()
函数的参数列表与格式字符串一致,就可以进行任何修改。
您还可以通过连接格式说明符的片段来进行快速更改,以构建完整的格式字符串,也可以使用sprintf()
等函数来构建格式说明器字符串。
您可以将星号与 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提供了出现在基数字符之后的位数
由于ANSI C99,通过有或。但是bool是否也有格式说明符? 它将打印:
有了,我可以使用表示
有人能解释一下printf中的是如何使用说明符“%g”的吗?下面的输出让我很困惑: 我了解到使用最短的表示形式。 但是下面的输出仍然让我困惑 我的问题是:为什么能给出确切的数字,而不能? 似乎16个有效数字是准确的。有人能告诉我原因吗?
本文介绍 TiDB 各组件命令行参数及配置文件参数,配置文件参数及比命令行参数支持更多的选项。 命令行参数 参阅 TiDB 配置参数及其他内容。 配置文件参数 参阅 TiDB 配置文件描述及其他内容。
当我在代码块中使用说明符F时,为什么编译器会给我错误“格式参数太多”? 错误:
在我正在读的一本书里,写着带有单个参数(没有转换说明符)的< code>printf被弃用。它建议替换为 与 或者 有人能告诉我为什么是错的吗?书上写着它包含漏洞,这些漏洞是什么?