【问题标题】:printf() and format specifier linkingprintf() 和格式说明符链接
【发布时间】:2016-06-26 10:10:35
【问题描述】:

我非常了解 printf() 和格式说明符的工作原理

注意:- 我使用的是 Turbo c/c++ 编译器,你知道 gcc、g++ 等要好得多,但问题仍然存在

代码:-

void main()
{
 clrscr();
 printf("%d %d %d");
 getch();
}

输出:- 0 344 0

现在,

代码:-

void main()
{
 clrscr();
 printf("%f %f %f");
 getch();
}

输出:- printf:浮点格式未链接 程序异常终止。

现在,还请注意,我已经在大约 200 个系统上尝试过这个。

问题:-我相信输出中显示的那些格式说明符编号并不是垃圾,因为每个系统都获得相同的结果,它们是 printf() 函数和格式说明符之间通过文件处理或指针。那么现在有人能最终说出它可能是什么吗?

注意:-结果可能因 IDE 不同而不同,但对于每个系统上的编译器都是相同的,因为我也在 codeblocks IDE 上尝试过。

【问题讨论】:

  • “我相信那些显示在输出上的格式说明符数字不是垃圾” - 你正在调用未定义的行为。信念是你唯一可以为你做的事情,因为其他一切都已经消失了。
  • 这是未定义的行为。您正在使用需要额外参数的格式说明符,但您没有提供它们。所以你得到了未指定的垃圾。您还错误地声明了main。它返回一个int,需要这样声明。
  • 就像我说的,我已经在一个大号上测试过这个。系统所以是的,我相信导致两个编译器在所有系统上的结果都是相同的,turbo c 编译器实际上是由 Dennis Ritchie 创建并由 borland 的人编辑的 borland c 编译器,根据 ANSI C main 可以具有 void 返回类型。
  • 您确定您的 Turbo C 编译器支持浮点吗?或者也许需要一个特殊的选项来打开这个支持?阅读此c-faq.com/fp/fpnotlinked.html
  • 这个问题完全没意思,应该关闭。如果你真的想看看你的随机堆栈访问在你的平台上做了什么,请查看汇编代码并弄清楚。这是一种乏味的浪费时间,但一点也不难。所以就去做吧。

标签: c printf format-specifiers


【解决方案1】:

那么现在有人能说出它可能是什么吗?

来自C11 Standard (draft) for the library function fprintf()

7.21.6.1/2

[...]

如果格式的参数不足,则行为是 未定义。

在代码调用未定义的行为之后,任何事情都可能发生。

【讨论】:

  • 我明白这一点,虽然草案说结果不应该在不同的系统上有所不同,但我可以理解未定义的行为,我也了解编译器设计,所以我目前将其视为未定义的自动机在编译器设计中。
【解决方案2】:

输出:- printf : 浮点格式未链接异常程序终止。

Turbo C 和 some 编译器不会链接到浮点支持,除非在用户代码中检测到浮点代码。 "%f %f %f" 需要 FP 支持才能工作,但编译器在 compile 时无法识别它。相反,程序在运行时间失败。

添加FP代码,摆脱printf()的其他误用;

#include <stdio.h>
#include <math.h>
int main() {
  clrscr();
  double a = sqrt(2.0):
  printf("%f %f %f\n",a,a,a);
  getch();
}

【讨论】:

    猜你喜欢
    • 2012-05-17
    • 2012-05-17
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    • 2018-10-09
    相关资源
    最近更新 更多