我在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中可以做什么?有替代功能吗?
答案 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.2fflush
功能
概要
1描述的#include <stdio.h> int fflush(FILE *stream);
2如果流指向输出流或最新的流更新流 如果没有输入操作,fflush
函数会导致该流的任何未写入数据 要传递到主机环境以写入文件;否则,行为是 未定义。
3如果stream
是空指针,fflush
函数会对所有人执行此刷新操作 上面定义了行为的流。
返回
4fflush
函数设置流的错误指示符,如果写入则返回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
您有两种选择:
10
输入 第二个选项有很多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;
}