Chinaunix

标题: 如何清空输入缓冲区的内容 [打印本页]

作者: zeroone1    时间: 2004-06-21 19:21
标题: 如何清空输入缓冲区的内容
在linux 9.0下,用fflush(stdin) 清空不了输入缓冲区:




  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. int main(void)
  4. {
  5. char ch;
  6. for(int i=0;i<10;++){
  7. ch=getchar();
  8. printf("Input: %c",ch);
  9. fflush(stdin);
  10. }
  11. return 0;
  12. }

复制代码


上面的程序输出较怪,用linux的帮我试一下,可以的话讲解一下

很感谢
作者: lenovo    时间: 2004-06-21 19:33
标题: 如何清空输入缓冲区的内容
char ch;

int ch;
作者: carol1980    时间: 2004-06-21 22:25
标题: 如何清空输入缓冲区的内容
用函数吧 stdin 的缓冲机制改掉试试

? 没看懂 lenovo 的意思
作者: lenovo    时间: 2004-06-21 22:30
标题: 如何清空输入缓冲区的内容
原帖由 "carol1980" 发表:
用函数吧 stdin 的缓冲机制改掉试试

? 没看懂 lenovo 的意思

偶的意思是把
char ch;
改成
int  ch;

用char类型会出问题的。
作者: carol1980    时间: 2004-06-21 22:34
标题: 如何清空输入缓冲区的内容
? 什么问题啊,不可见字符?
作者: lenovo    时间: 2004-06-21 22:42
标题: 如何清空输入缓冲区的内容
[quote]原帖由 "carol1980"]? 什么问题啊,不可见字符?[/quote 发表:


不好意思,刚才没仔细看。
他的程序我运行是没问题的。
不过不是linux平台。
我讲的意思是当你用ch和EOF比较是否
一个流的结束时,如果用char类型可能会出错的。
作者: lenovo    时间: 2004-06-21 22:43
标题: 如何清空输入缓冲区的内容
还有楼主最好把输出结果也贴出来,
看看怎么回事。
作者: zeroone1    时间: 2004-06-21 22:53
标题: 如何清空输入缓冲区的内容
如果将char ch  改成 int ch 在下面的程序中更不好便



  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. int main(void)
  4. {
  5.   int ch;
  6.   for(;;){
  7.     printf("Input:  ");
  8.     scanf("%d",&ch);
  9.     printf("Your enter: %d\n",ch);
  10.     fflush(stdio);
  11.   }
  12.   exit(EXIT_SUCCESS);
  13. }

复制代码


在上面的程序输入是数字都没有问题,但一但输入非数字的,
在我的linux 9上会死循环。
可能就是因为输入缓冲得不到清除,而我用的 %d  使程序不会接受
非数字的东东

没有其它办法清空输入缓冲的了吗???

我也要试着找
作者: zeroone1    时间: 2004-06-21 22:56
标题: 如何清空输入缓冲区的内容
在windows 系统我也试过如果用到 fflush(stdin) 效果会很好

只是现在在linux下,我的是 9
作者: lenovo    时间: 2004-06-21 23:03
标题: 如何清空输入缓冲区的内容
你的程序怎么又变成for(;这样的。
晕。
作者: zeroone1    时间: 2004-06-21 23:11
标题: 如何清空输入缓冲区的内容
原帖由 "lenovo" 发表:
还有楼主最好把输出结果也贴出来,
看看怎么回事。


  1. #include <stdio.h>;
  2. #include <stdlib.h>;

  3. int main(void)
  4. {
  5.   char ch;
  6.   for(int i=0;i<10;i++){
  7.     printf("Input: ");
  8.     scanf("%c",&ch);
  9.     printf("Your input: %c\n",ch);
  10.     fflush(stdin);
  11.   }
  12.   exit(EXIT_SUCCESS);
  13. }
复制代码



如下是程序执行结果:(有点乱,不好意思)


$ ./test_ch
/*输入 a */
Input: a           /*我输入一个a,得了这结果*/
Your input: a
Input: Your input:
/*输入 a 按ENTER 后到程序执行到这里,然后棘再提示输入(如下我输入b)*/

Input: b
Your input: b
Input: Your input:

Input: c
Your input: c
Input: Your input:

Input: d
Your input: d
Input: Your input:

Input: kda
Your input: k
Input: Your input: d
[/code]
作者: zeroone1    时间: 2004-06-21 23:14
标题: 如何清空输入缓冲区的内容
原帖由 "lenovo" 发表:
你的程序怎么又变成for(;这样的。
晕。


随便了,,都差不多的,,我不限制是想搞个死热循环嘛

本来最上我也想用for(;的,只是“循环”不会打,就改了,,
现在会打了,
作者: lenovo    时间: 2004-06-21 23:16
标题: 如何清空输入缓冲区的内容
我估计是你操作系统的问题。
据说rh9.0很差劲,
还不如用rh7.0呢。
作者: heishijiao    时间: 2004-06-22 01:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: heishijiao    时间: 2004-06-22 01:30
提示: 作者被禁止或删除 内容自动屏蔽
作者: whyglinux    时间: 2004-06-22 06:37
标题: 如何清空输入缓冲区的内容
C标准规定 fflush()函数是用来刷新输出(stdout)缓存的。对于输入(stdin),它是没有定义的。

但是有些编译器也定义了 fflush( stdin )的实现,比如微软的VC。其它编译器是否也定义了 fflush( stdin )的实现应当查找它的手册。GCC编译器没有定义它的实现,所以不能使用 fflush( stdin )来刷新输入缓存。

对于没有定义 fflush( stdin )的编译器,可以使用 fgets()函数来代替它(比用 getchar()、scanf()等函数通用性好)。比如楼主提供的第一个程序中可以这样忽略输入流中留下的回车等其它输入,从而使下一次的输入总保持一个“干净”的状态。
[code]
// ...
char sbuf[1024];
// ...
// fflush(stdin); // 用下面一句代替
fgets( sbuf, 1024, stdin );
// ...
作者: zeroone1    时间: 2004-06-22 14:28
标题: 如何清空输入缓冲区的内容
^_^

谢谢各位

都收到了




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2