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