为什么scanf语句在第一个printf语句之前执行?

时间:2019-08-22 14:00:55

标签: c eclipse printf scanf eclipse-neon

以下是一个简单的C程序:

#include <stdio.h>

int main(void)
{
    //Question 2.16

    //Variables that will be used to store the two numbers
    int num1;
    int num2;

    //Message to prompt the user
    printf ("Enter two numbers\n");

    //Accepting the users input
    scanf("%d %d" , &num1, &num2);

    if (num1 > num2) {
        printf("%d is greater\n", num1); // Print num1 if num1 is greater
    }
    else { //Otherwise print that num1 is not greater
        printf("%d is not greater\n", num1);
    }

    return 0; // End of program
}

但是,当我构建并运行程序(我使用的IDE是Eclipse Cpp Neon)时,必须在执行第一个printf语句之前输入变量num1和num2的值。有关控制台输出,请参见以下内容:

2 5

Enter two numbers

2 is not greater

我的问题很简单:为什么会这样?欢迎任何解释。

3 个答案:

答案 0 :(得分:3)

printf(...)

函数将输出放入输出流的缓冲区。因此有时可能会在一段时间后显示输出。

scanf(...)

功能使用输入流。

这两个函数都涉及独立的流,并且由于缓冲,每个代码的结果似乎不连续。强制冲洗任何流

int fflush(FILE *stream);

被使用。

请使用

fflush(stdout);

在打印语句后获得所需的输出。

答案 1 :(得分:1)

我的建议如下:

(1)显式使用而不是隐式使用流:例如,首选fprintf(stdout, "Enter two numbers\n"); fflush(stdout); 代替 printf ("Enter two numbers\n");。对scanf函数应用相同的规则-即,首选fscanf和您使用的流(例如stdin)。

(2)一次{strong>不不要对一个scan函数进行多次调味,这可能会导致流以无法计算的意外方式发生故障:因此,建议fscanf(stdin, "%d", &num1); fscanf(stdin, "%d", &num2); 代替 scanf("%d %d", &num1, &num2);

答案 2 :(得分:-1)

尝试在fflushprintf语句之间使用scanf

// Message to prompt the user
printf("Enter two numbers\n");
fflush(stdout);
// Accepting the user's input
scanf("%d %d", &num1, &num2);