9

我在 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 中做什么?有替代功能吗?

4

9 回答 9

19

不要使用 fflush,而是使用这个函数:

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

fflush(stdin)取决于实现,但此功能始终有效。在 C 中,使用fflush(stdin).

于 2013-06-26T11:46:22.613 回答
5

始终适用于 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);
}

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

于 2014-05-27T08:54:20.607 回答
4

fflush没有为输入流定义的行为(在线 2011 标准):

7.21.5.2fflush函数

概要

1

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

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

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

返回

4 该fflush函数设置流的错误指示符,如果发生写入错误则返回 EOF,否则返回零。
于 2013-06-26T12:41:08.210 回答
2

我在 LINUX 上工作时遇到了同样的问题,这个问题的替代解决方案可以是你定义一个虚拟字符,让我们说,并在你的实际输入发生之前char dummy; 放一个来扫描它。scanf()这对我有用。我希望它也对你有用。

于 2015-06-27T14:15:20.027 回答
1

fflush()对输入流没有多大作用,但由于scanf()从不返回,这无关紧要。scanf()阻塞,因为在您按下之前,终端窗口不会向 C 程序发送任何内容Enter

你有两个选择:

  1. 类型10 Enter
  2. 将终端置于原始模式。

第二个选项有很多drawbacls,你会失去编辑能力,所以我建议逐行阅读输入。

于 2013-06-26T11:38:36.867 回答
1

您必须改为包含并使用 __fpurge(whatever you want)。

来自阿根廷的致敬

于 2014-04-27T21:59:38.410 回答
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;
}
于 2020-07-10T05:38:57.903 回答
0

在 scanf 之后使用 getchar()

于 2018-10-10T19:17:32.030 回答
-1

通过bzero();在 Linux 中使用系统调用,我们可以刷新之前存储的值。请通过输入终端
阅读手册页。试试这个例子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;
} 
于 2016-06-06T04:58:15.367 回答