【问题标题】:Printf not working with scanfPrintf 不能与 scanf 一起使用
【发布时间】:2016-02-03 19:19:09
【问题描述】:

您好,我是编程新手,例如在我的代码中:

#include <stdio.h>

int main (void){
   int a;
   printf("Write a number: ");
   scanf("%d", &a);
   printf("Your written number was: %d", a);
   return 0;
}

Printf 在我启动程序时不会在控制台中写“写一个数字”,但只有在我已经插入数字并按下回车之后。 我已经做了一些研究,发现了这段代码:

setvbuf(stdout, NULL, _IONBF, 0);

当我将它粘贴到我的程序中时,它可以正常工作,但我想知道为什么我必须这样做?

【问题讨论】:

  • 在您的 printf 行中添加换行符“\n”。

标签: c scanf


【解决方案1】:

当我将它粘贴到我的程序中时,它可以正常工作,但我是 想知道为什么我必须这样做?

这是因为printf() 在连接到终端时通常是行缓冲的。因此,通过调用 setvbuf() 禁用缓冲会使 stdio 库根本不缓冲。

您也可以在printf() 调用之后使用fflush(stdout); 来清除缓冲的输出。 setbuf(stdout, NULL); 也可以这样做。


您还可以在printf() 语句的末尾添加\n 以强制刷新。但这只有在输出到终端设备时才有效。

例如,如果您这样做(在类 unix 系统上):

./a.out > output_file

那么\n 将不会刷新缓冲区。

在这两个选项(setbuf()fflush())中,fflush(stdout); 在大多数情况下可能是更好的选择。因为完全禁用缓冲会对性能产生负面影响(这是首先进行缓冲的主要原因),而 fflush() 可以在您认为有必要时在正确的位置明智地使用。

【讨论】:

  • 但是为什么我的书中写的代码是我学习的。另外,当我在互联网上查找时,包含此代码。 @I3x
  • @ŽigaGazvoda 可能作者没有意识到这一点,或者在这里忽略了它,并在书中的其他地方进行了解释,或者只是忘记提及它。我只能猜测。这是一种标准行为,没有什么意外/不寻常的。
【解决方案2】:

printf 有一个缓冲区。它是一种通过不必在用户上下文和内核上下文之间切换来使代码运行得更快的机制。要克服这个问题,您可以告诉代码刷新缓冲区 - 即将其发送到操作系统。这可以通过

fflush(stdout);

printf 之后。如果printf 包含新行,则会自动完成。

【讨论】:

  • 但是“如果 printf 包含新行,这是自动完成的”是什么意思。
【解决方案3】:

您可能希望在每个 printf 语句中都使用 \n。

【讨论】:

    【解决方案4】:

    将换行符“\n”添加到您的 printf 行,如下所示:

    printf("Write a number: \n");
    

    【讨论】:

    • 对不起这是什么意思?
    • 我认为你需要找到一本好的初学者书籍并完成它
    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2011-04-17
    • 2016-08-19
    相关资源
    最近更新 更多