ghosTzone
main(_){return _} && echo $? /* Keep It Simple Stupid | 本博客所有文章皆为原创 转载请注明 - ghosTM55 */

清除输入缓存

ghosTM55 posted @ 2008年11月22日 01:53 in C/C++ , 3405 阅读

  我们熟知的scanf()函数事实上并不是从键盘直接接受输入,而是检查键盘缓存。所以,初学者常常会对一些奇怪的输入问题感到困惑。先来看下面这段代码:

#include<stdio.h>
int main(void)
{
        int c='y';
        while(c=='y')
        {
                printf("y/n:");
                scanf("%c",&c);
        }
        return 0;
}

  无论程序执行者是循规蹈矩地输入一个y然后按下回车,或者是输入yes后按下回车,程序都不会按照表面看起来那样让执行者进行下一次循环:

txi@ghosTunix:~/programming/c/test$ ./a.out
y/n:y
y/n:txi@ghosTunix:~/programming/c/test$

  可以看到,在按下y+回车后,下一个循环直接跳过,并为执行。这是因为在第二个循环中,程序将回车,也就是"\n"赋值给了变量c,由于"\n"!='y',所以跳出了循环。通过清楚输入缓存,能够很好的解决这个问题:

#include<stdio.h>
int main(void)
{
        int c='y',flush;
        while(c=='y')
        {
                printf("y/n:");
                scanf("%c",&c);
                while((flush=getchar()) != '\n' && flush != EOF); /* 清除缓存 */
        }
        return 0;
}

  清楚输入缓存并没有官方的方法,通过执行一个空while语句,可以将输入缓存“消耗”掉。

  参考资料:http://www.c-faq.com,Question 12.26[ab]

txi@ghosTunix:~$ date
2008年 05月 18日 星期日 08:50:31 CST


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter