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

38

我正在使用Eclipse编写C/C++代码,但是我遇到了一些可能很简单的问题。在下面的代码中,我先使用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

你的问题有些令人困惑:“在我的代码中,我使用printf()和scanf()之后。”“printf是在scanf之前编写的。”这不是你放在代码中的内容。请重新表述你的问题。 - Elazar
你的代码对我有效。 - spartygw
你说得对,抱歉。 我的意思是,首先我想打印一些东西,比如: printf("输入一个数字:"); 然后从键盘读取数字。然后将数字打印到控制台上。但是在运行程序后,没有任何输出,程序等待输入。接收到输入后,程序会同时打印出"输入一个数字:"和数字本身。 - quapka
我不知道。也许是我的插件有问题。正如我之前所写的,我是新手,只是按照一些关于如何在Eclipse中设置C/C++的教程进行操作。也许最好删除所有内容,从头开始尝试。 - quapka
这个问题可能是一个重复的问题:printf不打印到屏幕上(14小时前发布)。 - Andreas Wenzel
2个回答

49

您的输出正在被缓冲。

  1. 显式刷新

    fflush 在每次写入后,可以利用缓冲并明确地强制执行所需的行为/显示。

 fflush( stdout );
  • 仅按行缓冲缓冲区

    当您知道仅打印完整行足以满足要求时,此功能非常有用

  •  setlinebuf(stdout);
    
  • 禁用缓冲区

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


  • 示例:

    以下是使用选项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;
    }
    

    谢谢。第一个选项可行。但是,考虑到编写更长、更复杂的代码,它似乎是一种相当混乱的解决方案。我的意思是,这就像是把工作量加倍了。不过我会尝试第四个选项。 - quapka
    如果您不关心缓冲及其可能的好处,可以选择选项3。这是一个一行代码(在程序中仅设置一次即可)。如果您不想或无法完全更改代码,则选项4是另一种选择。如果没有换行符,选项2可能无法可靠地回显您的输入。 - zsawyer
    每个 printf("%d", myvariable); 行最好在末尾加上一个换行符。仅当您有意逐步构建单行输出时才省略换行符。 - Jonathan Leffler
    如果使用setvbuf(..., _IONBF, ...)代替setbuf,并且使用setvbuf(..., _IOLBF, ...)代替setlinebuf,那么这个答案会更好。setvbuf是C标准库的一部分,而另外两个函数则不是。 - jamesdlin

    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;
    }
    

    I got it from here.


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接