C語言輸入函數與緩沖區
調用以下輸入函數,并從鍵盤輸入内容并回車後,緩沖區的情況
函數 | 緩沖區是否留下’\n’ |
---|---|
scanf() | yes |
gets() | no |
getchar() | yes |
對于會在緩沖區留下換行符’\n’的方法,如果連續兩次調用,輸入完第一次以後,會自動跳過第二次輸入,為什麼呢?
因為實際上,C語言采用了緩沖區的機理,我們的輸入的字元(包括回車)都會先存入輸入緩沖區,scanf()、gets()、getchar()三個函數,實際上是讀取緩沖區内容的指令,如果緩沖區中有内容,就直接讀取緩沖區中的内容,隻有當緩沖區中沒有任何内容,才會要求鍵盤輸入。
調用完這些函數之後是否會在緩沖區留下回車字元,是由他們讀取緩沖區的方法所決定的。scanf函數根據輸入格式的不同,讀取的位元組數會不同。當讀取的是%s時,會一直讀到空格或者換行符以前的字元,也就是說緩沖區會留下空格或者換行符及以後的内容。gets函數和scanf讀取字元串的終止位置是一樣的,隻是它會自動清除緊接着的換行符。getchar函數是從緩沖區中讀取一個字元,不會去掉後面的換行符。
那麼對于要連續多次調用那些會在緩沖區中留下其他字元的函數,并且保證每次都提示輸入,就要在第二次及以後調用之前先清空緩沖區,具體就是調用這句話:
while (getchar()!=‘\n');