【问题标题】:printf() and scanf() in order? [duplicate]printf() 和 scanf() 的顺序? [复制]
【发布时间】:2021-12-04 22:55:47
【问题描述】:

我是 C 编程的初学者。我不明白一件事。如果我放下它,为什么?

printf("write down any whole number:");
scanf("%d",&(any int variable));

当我使用 gdb(debugger) 时,它显示 CPU 执行 printf(),但没有写入任何内容,然后转到 scanf() 指令,然后写入 String 并接受它通过scanf函数进行分析。

我正在使用 GCC 和 Linux Debian

问题:为什么printf只在scanf之后执行?

谢谢。

【问题讨论】:

  • 我不知道为什么,可能是优化完成的,但要解决这个问题,您可以使用fflush() 打印它

标签: c linux string


【解决方案1】:

正如您在调试器中看到的那样——您作为初学者使用了一个非常棒! — printf 已经执行好了。字符现在位于缓冲区中,当输出换行符或缓冲区已满时将被刷新,这可能发生在 4096 字节或其他数量,通常是 2 的幂。缓冲的原因是效率:实际传输到终端很慢。如果它发生在每个字符上,那将是不必要的慢。解决方法是打印一个换行符,或者用 flush 显式刷新。

【讨论】:

  • 非常感谢。当我写 printf("hello"); 时,它让我大吃一惊。然后我添加了一个循环,结果证明 printf 是在循环之后执行的。 )))))
  • 我的意思是“printf在循环后执行”没有执行,而是刷新了
  • 阅读链接的答案我意识到我的答案只对了一半:即使没有换行符,您的文本也应该在程序等待 scanf 输入之前出现;这正是为此用例指定的。所以,我写的没有错,但有趣的问题是 为什么 缓冲区没有在 scanf 之前被刷新,因为它应该是。可能是您使用了显示输出的 IDE,例如在文本窗口等中。由于某种原因,连接到在 IDE 中运行的程序的标准输出不会将自己标识为终端(即,isatty(fd) 返回 0)。
  • 谢谢。我也阅读了链接的答案。我明白了)))。但是你给了我主要的想法)))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多