清空输入缓存的方法
緩存的清空方法
1、fflush(?stdin)?
這個(gè)可以很好得解決問(wèn)題,但不是可移植的。
MSDN?文檔里清楚地寫著fflush?on?input?stream?is?an?extension?to?the?C?standard(fflush?操作輸入流是對(duì)?C?標(biāo)準(zhǔn)的擴(kuò)充),也就是說(shuō)不是所有的編譯器都支持這么用。VC是支持的,如果不用考慮程序的移植性,用fflush(stdin)?也沒什么大問(wèn)題。
2、讀字符清空
如果不能用上面的方法,還可以考慮:while(getchar()!='\n');即一直讀緩沖區(qū),直到換行為止。這個(gè)方法如果用在數(shù)字的輸入后是很有效的,如果本來(lái)希望輸入數(shù)字,但是不小心在數(shù)字后面鍵入了個(gè)字母,這個(gè)方法能很好的解決。
但是,若是字符串的輸入,則有些棘手。fgets(name,10,stdin); while(getchar()!='\n');這個(gè)辦法就不能得到好的效果。如果字符串超過(guò)了9個(gè)字符,則程序只讀入前9個(gè)字符,后邊的字符一直到換行都被getchar()消耗掉,這正合我意,但如果鍵入的字符串加上回車不到9個(gè)字符,則程序會(huì)一直等待,直到下一個(gè)換行字符,這會(huì)影響程序的邏輯。所以,這種方法來(lái)處理輸入字符串后的緩沖區(qū),是不合適的。
針對(duì)這個(gè)問(wèn)題,我們進(jìn)行改進(jìn),改進(jìn)是基于fgets函數(shù)的特性的。
char?name[10];
fputs("enter?your?name\n",stdout);
fgets(name,10,stdin);
if(strlen(name)==9?&&?name[8]!='\n'?)
while(getchar()!='\n');
這樣,我所遇到的問(wèn)題得到解決。在第三行從緩沖區(qū)讀入最多9個(gè)字符,這時(shí)有三種情況:用戶輸入了7個(gè)或以下字符并按回車,這時(shí)數(shù)組name里的字符串長(zhǎng)度小于9,且緩沖區(qū)是空的,無(wú)需清除;
用戶輸入了8個(gè)字符并按下回車,這時(shí)數(shù)組name里字符串長(zhǎng)度為9,且name[8]為'\n',這時(shí)緩沖區(qū)也是空的,無(wú)需清除;
用戶輸入了8個(gè)以上的字符,并按回車,這時(shí)name里的字符串長(zhǎng)度為9,緩沖區(qū)不空,至少有一個(gè)'\n',且以'\n'結(jié)尾。
由以上三種情況的分析,就可以得到if(strlen(name)==9?&&?name[8]!='\n'?)這個(gè)判斷句。
轉(zhuǎn)載于:https://www.cnblogs.com/lxjsailor/archive/2012/10/06/2713022.html
總結(jié)
- 上一篇: 程序员面试题100题第29题——调整数组
- 下一篇: 【javascript】解决setTim