【问题标题】:console input C控制台输入 C
【发布时间】:2020-02-18 19:32:37
【问题描述】:

我是 C 初学者,想知道我的代码有什么问题:

#include "stdio.h"

int main(void)
{ 
    int a;

    printf("Please input an integer value: ");
    scanf("%d", &a);
    printf("You entered: %d\n", a);

    return 0;
}

我的问题是我必须在有任何 consol 输出之前输入一个值,例如,如果我输入 7,我会得到这个控制台输出:请输入一个整数值:您输入:7

我在另一台计算机上尝试了完全相同的代码,它运行得很好,我猜是缓冲区问题?但我不知道如何解决它..有什么想法吗?

【问题讨论】:

  • 你需要打印一个换行符,或者刷新stdout,因为它被缓冲了:fflush(stdout);
  • 谢谢克里斯蒂安,它有效!但我可以了解更多详情吗?为什么它可以在我朋友的计算机上运行,​​而在我的计算机上不刷新?我每次都必须这样做吗?
  • 在某些环境中,stdio 缓冲区会在 scanf()fgets() 等输入函数上自动刷新,但这不是您可以依赖的。
  • 好的,很清楚!谢谢大家!
  • 有些系统会在输出换行符时刷新缓冲区,但你不要在scanf之前写一个。

标签: c input console scanf


【解决方案1】:

正如其他已经提到的,为了保证该行将在您的代码中的该点打印,您可以像这样刷新标准输出,

#include "stdio.h"

int main(void)
{ 
    int a;

    printf("Please input an integer value: ");
    fflush(stdout);
    scanf("%d", &a); 
    printf("You entered: %d\n", a);

    return 0;
}

您可以阅读本文了解更多详情,Why does printf not flush after the call unless a newline is in the format string?

感谢@Osiris cmets 更新

【讨论】:

  • 好吧,在这种情况下并不重要。
  • 没有。情况并非如此,您来自scanf() 的输入无论如何您都会看到它,要隐藏输入,您必须使用带有掩码的函数。
  • printf() 之前您不会看到输出本身。也许有用的是在第二个 printf 之后加上另一个 fflush() 代码增长。或者如链接中所述,只需将缓冲区设置为 0:setbuf(stdout, NULL);
  • 你完全正确。在scanf() 要求输入之后,可能会出现第一个 printf。
  • 由于我的 cmets 不适用于更新的答案,我将删除它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-19
  • 2018-03-17
相关资源
最近更新 更多