【问题标题】:C/C++ printf() before scanf() issuescanf() 问题之前的 C/C++ printf()
【发布时间】:2019-04-15 12:21:47
【问题描述】:

我正在使用 Eclipse 编写 C/C++ 代码,但我正在努力解决可能非常简单的问题。在下面的代码中,我使用printf()scanf() 之后。尽管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

【问题讨论】:

  • 您的问题令人困惑:“在下面的代码中,我使用 printf() 和 scanf() 之后”。 “printf 写在 scanf() 之前”。这不是您在代码中输入的内容。请改写您的问题。
  • 你的代码对我有用。
  • 你是对的,对不起。我的意思是,首先我想打印一些东西,在这种情况下: printf("Enter a number:");然后从键盘读取数字。然后将数字打印到控制台中。但相反,在运行程序后什么都没有打印出来,程序等待输入。收到输入后,程序会打印出“输入数字:”和数字本身。
  • 我不知道。也许我有错误的插件或其他东西。正如我之前所写的,我对此很陌生,我只是关注了一些关于如何在 Eclipse 中设置 C/C++ 的教程。也许最好删除所有内容并尝试从头开始。
  • 此问题可能与以下问题重复:printf not printing to screen(较早 14 小时发布)

标签: c printf output scanf


【解决方案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;
}

【讨论】:

  • 谢谢。第一个选项有效。但是,考虑到编写更长更复杂的代码,这似乎是一个相当混乱的解决方案。我的意思是,这就像加倍工作。不过我会尝试第四个。
  • 如果您不关心缓冲及其可能的好处,您可以选择选项 3。它是单行的(仅在您的程序中设置一次并完成)。如果您不想或根本无法更改代码,则选项 4 是一种替代方法。如果没有换行符,选项 2 可能无法可靠地回显您的输入。
  • printf("%d", myvariable); 中的每一行在末尾加上换行符会更好。仅当您有意识地构建单行输出时才省略换行符。
  • 这个答案如果使用setvbuf(..., _IONBF, ...)而不是setbuf并使用setvbuf(..., _IOLBF, ...)而不是setlinebuf会更好。 setvbuf 是 C 标准库的一部分;其他两个不是。
【解决方案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;
}

我是从here 那里得到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2011-07-21
    相关资源
    最近更新 更多