fflush()在Linux中不起作用

时间:2013-06-26 11:33:52

标签: 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)
  }

我得到的输出是:

Enter some value: 10

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

9 个答案:

答案 0 :(得分:11)

请勿使用fflush,请改用此功能:

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

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

答案 1 :(得分:3)

未为输入流(online 2011 standard)定义fflush的行为:

7.21.5.2 fflush功能

概要

1

    #include <stdio.h>
    int fflush(FILE *stream);
描述

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

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

返回

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

答案 2 :(得分:3)

总是在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);
}

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

答案 3 :(得分:2)

我在使用LINUX时遇到了同样的问题,这个问题的另一种解决方案是你定义一个虚拟角色让我们说char dummy; 并在实际输入发生之前放一个scanf()进行扫描。这对我有用。我希望它对你也有用。

答案 4 :(得分:1)

fflush()对输入流没有太大作用,但由于scanf()永远不会返回,这无关紧要。 scanf()阻止,因为终端窗口不会向C程序发送任何内容,直到您按 Enter

您有两种选择:

  1. 键入10 输入
  2. 将终端设置为原始模式。
  3. 第二个选项有很多drawbacls,就像你会失去编辑功能一样,所以我建议逐行读取输入。

答案 5 :(得分:1)

您必须包含并使用__fpurge(无论您想要什么)。

阿根廷致敬

答案 6 :(得分:0)

通过在Linux中使用bzero();系统调用,我们可以刷新以前存储的值 请在终端bzero();中输入man bzero的手册页。 试试这个例子

#include<stdio.h>
#include<string.h>

int main()
{
  char buf[]={'y'};
  int num;
  while(buf[0]=='y')
  {
    printf("enter number");
    scanf("%d",&num);
    printf("square of %d is %d\n",num,num*num);
    bzero(buf, 1);
    printf("want to enter y/n");
    scanf("%s",&buf[0]);
  }
  return 0;
} 

答案 7 :(得分:0)

在scanf之后使用getchar()代替

答案 8 :(得分:0)

#include<stdio.h>
int main()
{
char ans='y';
int a;
while(ans=='y'||ans=='Y')
    {

     printf("Type a number:-");
     scanf("%d",&a);
     printf("square of number = %d\nwant to enter 
     number again(y/n)?\nANS=",a*a); 
     scanf("%s",&ans);//use %s in place of %c
     }
return 0;
}