Printf无法使用scanf

时间:2016-02-03 19:19:09

标签: c scanf

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

#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不写&#34;写一个号码&#34;在我启动程序的控制台中,但只有在我已插入数字并按下回车后。 我已经做了一些研究,发现了这段代码:

setvbuf(stdout, NULL, _IONBF, 0);

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

4 个答案:

答案 0 :(得分:1)

  

当我将其粘贴到我的程序中时,它应该可以正常工作但我是   想知道我为什么要那样做?

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

您还可以在fflush(stdout);调用后使用printf()来清除缓冲输出。同样可以使用setbuf(stdout, NULL);完成。

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

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

./a.out > output_file

然后\n不会刷新缓冲区。

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

答案 1 :(得分:1)

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

来完成
fflush(stdout);

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

答案 2 :(得分:0)

将printfeed“\ n”添加到printf行中,如下所示:

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

答案 3 :(得分:0)

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