扫描()问题之前的C / C++ printf()

C/C++ printf() before scanf() issue

提问人:quapka 提问时间:6/2/2013 最后编辑:Mark Rotteveelquapka 更新时间:6/20/2022 访问量:50377

问:

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

法典:

#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
c printf 输出 scanf

评论

0赞 Elazar 6/2/2013
您的问题令人困惑:“在下面的代码中,我使用 printf() 和 scanf() 之后”。“printf 写在 scanf() 之前”。这不是你在代码中输入的内容。请重新表述您的问题。
0赞 spartygw 6/2/2013
你的代码对我有用。
0赞 quapka 6/2/2013
你是对的,对不起。我的意思是,首先我想打印一些东西,在这种情况下:printf(“输入一个数字:”);然后从键盘上读取数字。然后将数字打印到控制台中。但是,在运行程序后,没有任何内容打印出来,程序等待输入。收到输入后,程序会同时打印出“输入数字:”和数字本身。
0赞 quapka 6/2/2013
我不知道。也许我有错误的插件或其他东西。正如我之前所写的,我是新手,我只是遵循了一些关于如何在 Eclipse 中设置 C/C++ 的教程。也许最好删除所有内容并尝试从头开始。
0赞 Andreas Wenzel 2/23/2022
这个问题可能是重复的:printf 不打印到屏幕(发布 14 小时轻松)

答:

49赞 zsawyer 6/2/2013 #1

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

  1. 显式刷新

    fflush每次写入后,从缓冲区中获利,并且仍然显式强制执行所需的行为/显示。

     fflush( stdout );
    
  2. 仅按行设置缓冲区

    当您知道仅打印完整的行就足够了时很有用

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

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


例子:

以下是带有选项 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;
}

评论

0赞 quapka 6/2/2013
谢谢。第一个选项有效。但是,考虑到编写更长、更复杂的代码,这似乎是一个相当混乱的解决方案。我的意思是,这就像将工作量加倍。不过,我会尝试第四个。
0赞 zsawyer 6/2/2013
如果您不关心缓冲及其可能的好处,则可以选择选项 3。这是一个单行代码(在您的程序中仅设置一次并完成)。如果您不想或根本无法更改代码,则选项 4 是一种替代方法。如果没有换行符,选项 2 可能无法可靠地回显您的输入。
0赞 Jonathan Leffler 9/15/2016
每行末尾都有一个换行符会更好。只有当您有意识地零碎地构建一行输出时,才省略换行符。printf("%d", myvariable);
0赞 jamesdlin 11/14/2018
如果用 代替 和 用代替 ,这个答案会更好。 是 C 标准库的一部分;另外两个不是。setvbuf(..., _IONBF, ...)setbufsetvbuf(..., _IOLBF, ...)setlinebufsetvbuf
6赞 quapka 6/2/2013 #2

好的,最后我使用了类似于@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;
}

我是从这里得到的。