[问题] 关于清空键盘缓冲区

楼主: wei115 (ㄎㄎ)   2017-12-07 22:33:55
开发平台(Platform): (Ex: Win10, Linux, ...)
win10 + cygwin
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
GCC 6.4.0
问题(Question):
我想要清空缓冲区
试过fflush(stdin)[非标准] 和 setbuf(stdin, NULL)[标准]
但我刚刚写的题目中却发现这两个都没在工作,缓冲区一样有东西没被清空
但我用GDB除错的时候就正常工作了....
最后我用scanf("%[^\n]*s"); getchar();就正常运作
直接用scanf("%[^\n]*s%*c"); 也有机率不工作
这是我对缓冲区有所误解以至于我错误使用这些功能吗?
还是这些函式没有竞争力,不懂什么叫做吃苦当吃补,都没在作功德
谢谢
作者: cuteSquirrel (松鼠)   2017-12-07 22:48:00
XD
作者: galic (嘎利)   2017-12-07 23:20:00
scanf("%[^\n]*s")的 "*s" !?为何不用通用的 while loop 配getchar 就好
楼主: wei115 (ㄎㄎ)   2017-12-07 23:26:00
疴....比较短?
作者: LPH66 (-6.2598534e+18f)   2017-12-08 02:35:00
回二楼, %[..]s 用来接受一个只含 [] 里字符的字串如果 [..] 以 ^ 开头就是接受不含这些字的字串然后那个 * 表示接受输入但不存进变量里咦等一下我好像弄错了, 好像要 "%*[^\n]" 才对...我试一下嗯, 确实是要 "%*[^\n]" 才对, [..] 的地位跟 %s 的 s 一样所以原 PO 原本的写法变成“收一个不含换行字串进变量,再收 * s 两个字”--但原 PO 没给位址所以是错的写法这也解释了为什么原 PO 接 %*c 会无法作用的原因因为在“收 * 字”的时候就炸掉了
作者: alan23273850   2017-12-08 02:42:00
http://www.programmer-club.com.tw/ShowSameTitleN/c/43591.html1. fflush只对stdout有定义,所以不可接stdin2. setbuf是设定接下来的缓冲区模式,并不会清空之前残留的缓冲区内容3. 网站内使用 scanf("%*[^\n]%*c");反正要清空stdin缓冲区要自己吃就对了,什么内建函式都不要用,免得debug底到一肚子气XD
作者: Davinais (水灵流喵)   2017-12-08 03:38:00
fflush不是拿来清stdin的,他在那里没有定义(茶
作者: galic (嘎利)   2017-12-08 10:43:00
c的标准没定义没错 但POSIX有定义所以回到原点 还是用while loop配getchar吧 XD

Links booklink

Contact Us: admin [ a t ] ucptt.com