34

我正在使用 Eclipse 以 C/C++ 编写代码,并且我正在努力解决可能非常简单的事情。在下面的代码中,我使用printf()and after scanf()。尽管在输出不同printf之前写入。我能够在这里scanf()找到有关类似问题的信息。但我无法解决它。有任何想法吗?

代码:

#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
4

2 回答 2

46

您的输出正在被缓冲。您有 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;
}
于 2013-06-01T21:27:41.417 回答
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;
}

我从这里得到的。

于 2013-06-01T21:54:11.613 回答