原文:http://www.tomytime.com/archives/218/
fflush()函数是标准的作法。
setbuf(stdin,NULL)是GCC下可用的一种方法。
scanf("%*[^ ]%*c")是用扫描集将缓冲区中的字符全部读取来实现清除缓冲区的动作。
我最近在ubuntu下写一个程序,涉及到了这方面的问题。用fflush()和setbuf(stdin,NULL)都没有解决掉缓存的问题。 (奇怪的错误,DT地不想调试。)后来,搜到有 scanf("%*[^ ]%*c") 这种方法。非常管用,而且还跨平台。
scanf("%*[^ ]%*c")解释:
%*〔^ 〕将逐个读取缓冲区中的' '字符之前的其它字符,%后面的*表示将读取的这些字符丢弃,前遇到' '字符时便停止读取操作,此时,缓冲区中尚有一个' '字符遗留,所以后面的%*c将读取并丢弃这个遗留的换行符,这里的星号和前面的星号作用相同。由于所有从键盘的输入都是以回车结束的,而回车会产生一个' '字符,所以将' '连同它之前的字符全部读取并丢弃之后,也就相当于清除了输入缓冲区。