在scanf()问题之前的C / C ++ printf()

时间:2013-06-01 21:08:23

标签: c printf output scanf

我正在使用Eclipse来编写C / C ++代码,而我正在努力解决可能非常简单的问题。在下面的代码中,我使用printf()并在scanf()之后。 Althougth printf是在scanf()输出不同之前编写的。我能够找到类似问题的here。但我无法解决它。有什么想法吗?

代码:

#include <stdio.h>

int main()
{
    int myvariable;

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

预期产出:

Enter a number:1
1

相反,我得到:

1
Enter a number:1

3 个答案:

答案 0 :(得分:32)

您的输出正在缓冲。 您有4个选项:

  1. 显式刷新

    每次写入以从缓冲区中获利后,

    fflush仍然明确强制执行所需的行为/显示。

    fflush( stdout );
    
  2. 缓冲区只有缓冲区行

    当你知道只打印完整的行

    时,

    非常有用

    setlinebuf(stdout);
    
  3. 禁用缓冲区

    setbuf(stdout, NULL);
    
  4. 通过它提供的选项菜单在控制台中禁用缓冲


  5. 示例:

    以下是带有选项1的代码:

    #include <stdio.h>
    int main() {
    
        int myvariable;
    
        printf("Enter a number:");
        fflush( stdout );
        scanf("%d", &myvariable);
        printf("%d", myvariable);
        fflush( stdout );
    
        return 0;
    }
    

    这是2:

    #include <stdio.h>
    int main() {
    
        int myvariable;
    
        setlinebuf(stdout);    
    
        printf("Enter a number:");
        scanf("%d", &myvariable);
        printf("%d", myvariable);
    
        return 0;
    }
    

    和3:

    #include <stdio.h>
    int main() {
    
        int myvariable;
    
        setbuf(stdout, NULL);     
    
        printf("Enter a number:");
        scanf("%d", &myvariable);
        printf("%d", myvariable);
    
        return 0;
    }
    

答案 1 :(得分:6)

好的,所以最后我使用了类似于@zsawyer写的标签为3的选项。 在我的代码中,我插入了这一行:

setvbuf(stdout, NULL, _IONBF, 0);

作为main()中的第一行:

#include <stdio.h>

int main()
{
    setvbuf(stdout, NULL, _IONBF, 0);

    int myvariable;

    printf("Enter a number:");
    scanf("%d", &myvariable);
    printf("%d", myvariable);

    return 0;
}

我是从here获得的。

答案 2 :(得分:0)

快速而轻松,我只是定义了一个名为“ eprint”的宏,以在调用 printf(...)之后添加 flush() / strong>,而我只使用下面的eprint宏:

#define eprintf(...) printf(__VA_ARGS__); \
                 fflush(stdout);      \

此处的示例代码:

#include <stdio.h>
#include <stdlib.h>

#define eprintf(...) printf(__VA_ARGS__); \
                     fflush(stdout);      \

int main(void) {
    int a;

    eprintf("a=");

    scanf("%d",&a);

    eprintf("I've read value %d.\n",a);

    return EXIT_SUCCESS;
}

Eclipse控制台输出:

a=5
I've read value 5.

PS:我只花了30分钟的时间来查找这个Eclipse控制台问题和可能的修复程序,对于任何想找这种东西的人来说,这似乎是最直接,最容易理解的事情。