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

printf(“%f”,x)正常,printf(“%f”,x)错误格式参数太多

傅经业
2023-03-14

当我在代码块中使用说明符F时,为什么编译器会给我错误“格式参数太多”?

#include <stdio.h>

int main()
{
    float x = 3.14159;
    printf("%f\n", x);
    printf("%F\n", x);
    return 0;
}

错误:

error: unknown conversion type character 'F' in format [-Werror=format=]

error: too many arguments for format [-Werror=format-extra-args]

共有3个答案

鲁斯伯
2023-03-14

编译器向您提供错误“printf的参数太多”,因为它无法将%F识别为格式说明符。。。。因此,您添加到printf()的参数是额外的,不应该存在。

下面C89中的标准格式说明符指定浮点格式eefgg(不包括f,原因在本答案的最后一次编辑中说明)

请记住,编译器根本不应该读取printf()的格式字符串来匹配参数和格式说明符,因此那里发生的事情应该只处理printf(3)规范,这确实是printf(3)的问题,而不是编译器的问题。如果您尝试生成的程序,它可能会工作。

我试过使用clang(对不起,我这里没有gcc),我发现了一些可能的问题原因(也不是错误)。这里的printf(3)实现根本不会切换到科学符号(这是我没有用标准检查过的),因此它永远不会生成字母字符,也不会涉及小写或大写字母。那么对于这个节目呢

#include <stdio.h>

int main()
{
        printf("%5.3G\n", 3.141592654E160);
}

它打印:

$ ./a.out
3.14E+160
$ _

而对于

#include <stdio.h>

int main()
{
        printf("%5.3F\n", 3.141592654E160);
}

它打印

$ a.out
31415926539999999255132844331312943389972993386142531366742209094398699375217155068328829400434148008839629239544769533043070670437328460352417427610347451187200.000
$ _

由于只发出数字和小数点,因此格式说明符的大小写没有大写或小写解释,使两种形式等效(但其中一种是非标准的)。

解决方案就是切换到小写的f

正如@chux-ReinstateMonica在其中一个注释中所说,C89,第133页(pdf的143页),标准不包括F格式说明符,只包括eEfgG。这应该是正常的,因为f永远不会变成指数表示法。

邢运良
2023-03-14

F格式说明符最初是在C99中引入的。您的编译器似乎符合C89/C90,或者启用了std=C90/std=C89编译器选项。

如果您配置的编译器是gcc,您可以使用gcc--version命令来检测版本。

否则,您应该检查编译器使用的标准设置编译器选项。请看这里:

如何在代码块上添加编译器标志

虽然对于Ubuntu(我不知道您使用的是什么操作系统上的代码块),但这个答案让您直观地了解了代码块中编译器选项的设置。

赵永新
2023-03-14

奇怪的是,某些版本的GCC无法识别%F。对于采用C11标准的windows,我的gcc 9.2.0版(tdm64-1)无法识别它,尽管它仅将其作为警告消息而非错误发出。

$ gcc main2.c -Wextra -Wall -pedantic -std=c11
main2.c: In function 'main':
main2.c:7:14: warning: unknown conversion type character 'F' in format [-Wformat=]
    7 |     printf("%F\n", x);
      |              ^
main2.c:7:12: warning: too many arguments for format [-Wformat-extra-args]
    7 |     printf("%F\n", x);
      |            ^~~~~~

执行时,不会打印值。

我猜想您可能在Windows系统中使用了一些mingW安装,您的编译器必须将警告视为错误,这不是一个坏主意。

正如@HolyBlackCat所建议的,添加-D\u USE\u MINGW\u ANSI\u STDIO标志解决了这个问题。

这个线程有如何做的说明。

@RobertS支持Monica Cellio的回答有一个链接,说明如何将其添加到CodeBlock。

或者,要快速修复代码,您可以使用%G,或%E进行科学记数。

 类似资料:
  • 问题内容: 在C语言中,printf()语句允许在参数列表中提供精度长度。 星号分别替换为第一和第二个值。 我正在寻找Android / Java中的同等产品;String.format()引发异常。 编辑:谢谢,@Tenner; 它确实有效。 问题答案: 我用 有点难看(并且字符串连接使其性能不佳),但是它可以工作。

  • 问题内容: 在我的中,我需要使用,但是我不确定如何截断到2个小数位: 示例:获取 打印为: 问题答案: 用这个:

  • 问题内容: 今天,我正在为即将参加的Java考试而学习,但遇到了这个问题: 设一个定义如下的类: 该指令产生的输出是什么? 答案似乎是,但我不明白为什么。有人可以给我适当的解释吗? 问题答案: 与具有可变参数列表的函数相比,重载解析始终偏向于使用具有明显数量的参数的函数,即使这意味着该函数是自动装箱的。 更详细地说,根据JLS 15.12.2 选择具有此优先级的函数: 类型加宽 自动装箱 可变参数

  • 假设我有以下功能: 我希望调用者指定要打印的浮点数,以及小数点后的位数。(由<代码>表示)。%d说明符) 然而,在编译此代码时,我收到两个警告: 和 我的问题是:如何将格式说明符(例如本例中的)注入现有格式说明符?

  • 描述 (Description) 此函数将通过FORMAT指定的格式解释的LIST值打印到当前输出文件句柄或FILEHANDLE指定的值。 有效地相当于打印FILEHANDLE sprintf(FORMAT, LIST) 如果不需要特定的输出格式,可以使用print代替printf。 以下是已接受的格式转换列表。 Sr.No. 格式和结果 1 %% 百分号 2 %c 具有给定ASCII码的字符 3

  • printf(格式化输出数据) 相关函数 scanf,snprintf 表头文件 #include<stdio.h> 定义函数 int printf(const char * format,.............); 函数说明 printf()会根据参数format字符串来转换并格式化数据,然后将结 果写出到标准输出设备,直到出现字符串结束('\0')为止。参数 format字符串可包含下列三