fflush()在Linux中不起作用

sun*_*dar 6 c linux gcc

我在Linux GCC中使用了fflush()但它没有用.该功能有其他替代方案吗?这是我的代码:

#include<stdio.h>
void main()
{
  char ch='y';
  while(ch=='y')
  {
    int a;
    printf("Enter some value:");
    scanf("%d",&a);
    fflush(stdin);
    printf("Do you want to continue?");
    scanf("%c",&ch)
  }
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

Enter some value: 10
Run Code Online (Sandbox Code Playgroud)

然后程序结束.就这样.我在Linux中可以做什么?有替代功能吗?

Mat*_*uin 11

不要使用fflush,而是使用此功能:

#include <stdio.h>
void clean_stdin(void)
{
    int c;
    do {
        c = getchar();
    } while (c != '\n' && c != EOF);
}
Run Code Online (Sandbox Code Playgroud)

fflush(stdin)取决于实现,但此功能始终有效.在C中,使用它被认为是不好的做法fflush(stdin).

  • `fflush(stdin)`是一种不好的做法,而不是`fflush`.;) (6认同)
  • 你能解释一下这是如何工作的,而不只是说"不要使用它,使用它,它有效"吗? (2认同)

ata*_*xic 7

始终在 Linux 上运行的一种:

#include <termios.h>
#include <unistd.h>

void clean_stdin()
{
        int stdin_copy = dup(STDIN_FILENO);
        /* remove garbage from stdin */
        tcdrain(stdin_copy);
        tcflush(stdin_copy, TCIFLUSH);
        close(stdin_copy);
}
Run Code Online (Sandbox Code Playgroud)

您不仅可以将tcdraintcflush用于 in/out/err fd。


Joh*_*ode 5

fflush未针对输入流定义的行为(在线 2011 标准):

7.21.5.2fflush函数

概要

1

    #include <stdio.h>
    int fflush(FILE *stream);
Run Code Online (Sandbox Code Playgroud) 描述

2 如果流指向未输入最近操作的输出流或更新流,则该fflush函数会导致该流的任何未写入数据被传送到主机环境以写入文件;否则,行为是未定义的。

3 如果stream是空指针,则该fflush函数对上面定义了行为的所有流执行此刷新操作。

返回

4 该fflush函数设置流的错误指示符,如果发生写入错误,则返回 EOF,否则返回零。