? 最近遇到了輸入字符串時的一些問題秸讹,就是使用scanf(gets)函數(shù)給字符庆猫、字符串賦值的時候该溯,回車(\n)算進(jìn)去了岛抄,導(dǎo)致我的結(jié)果錯誤。
其實我一直都知道緩存區(qū)的存在狈茉,就是太久沒有寫過關(guān)于字符串操作的代碼了(好吧夫椭,很久沒有敲打碼了,最近懶了)氯庆,C語言中蹭秋,從控制臺輸入給變量賦值,實際上先是給到緩存區(qū)堤撵,再從緩存區(qū)讀取感凤,賦給變量的。注意的是每當(dāng)我們賦值粒督,敲下回車,回車作為結(jié)束標(biāo)志禽翼,并未讀取屠橄,留在緩存區(qū),若下次賦值給整型闰挡、浮點型還好沒什么問題锐墙,但是給字符、字符串就麻煩了长酗,它會將回車(\n)當(dāng)做字符讀取溪北。這個時候就需要將,清除緩存區(qū)夺脾。
清除緩存區(qū)的方法:
get char()
我們先來了解一下getchar()這個函數(shù)之拨,在有些地方我們會看到有人使用這個來解決上述的問題。getchar()咧叭,在我們學(xué)習(xí)單個字符的賦值的時候遇到蚀乔,它會在緩存區(qū)中讀取出來一個字符,給予變量菲茬。所以吉挣,這樣可以是使用它來解決一個回車的問題派撕。
(注:并沒有清除緩存區(qū))
但是,這個解決一個字符的問題睬魂。所以我們在介紹一下其他方法终吼。
fllush(stdin)
想必大家都知道它吧,經(jīng)常在一些同學(xué)寫的代碼能看到使用這個氯哮,清除緩存區(qū)际跪。這個是真的清除了緩存區(qū)了,但是蛙粘,接下來說的很重要垫卤,它并不是在C語言的標(biāo)準(zhǔn)函數(shù)庫里定義過〕瞿粒可是有同學(xué)在他們那可以運(yùn)行并且沒毛病穴肘。這是因為編譯器的問題,有的編譯器可以(VC6)舔痕,有的編譯器不可以(Linux 的gcc)评抚,我的就是gcc,所以我發(fā)現(xiàn)這個不同伯复,當(dāng)然上網(wǎng)一百度都知道慨代,但是自己debug的時候發(fā)現(xiàn)的時候,媽賣批怎么是這個問題啸如,記得會很深刻侍匙。
移植性差。
但是叮雳,我記得我以前在自己電腦也寫過清除緩存區(qū)的代碼啊想暗,不是這個嗎?對的帘不,不是它说莫。記得看黑馬程序員的C語言教學(xué)視頻的時候?qū)戇^,沒錯就是它寞焙。
rewind(stdin)
在gcc的編譯器下储狭,它是清除緩存區(qū)的作用的(其實不是清除,但有這個效果)捣郊。效果和fflush(stdin)一樣辽狈。實際上原理不是清除,而是模她,重新指向輸入的文件稻艰,緩存區(qū)內(nèi)還有之前的。
rewind(stdin)工作原理
C語言把鍵盤侈净,顯示器等設(shè)備當(dāng)做文件來處理尊勿,也就是說從鍵盤輸入相當(dāng)于從一個文件中讀入僧凤,向顯示器輸出相當(dāng)于向一個文件寫出。而stdin是C標(biāo)準(zhǔn)庫定義的標(biāo)準(zhǔn)文件之一元扔,它與鍵盤相關(guān)聯(lián)躯保。我一般把它理解為指向鍵盤這個“文件”的指針。而rewind()函數(shù)的作用是把文件的當(dāng)前位置指針指向文件頭澎语。兩者結(jié)合途事,rewind(stdin);的作用也就是把“指向鍵盤(一個文件)的指針從當(dāng)前位置挪到鍵盤(一個文件)開頭”,相當(dāng)于拋棄了當(dāng)前鍵盤緩沖區(qū)中的數(shù)據(jù)擅羞,重新開始輸入尸变。?雖然并不是真正的把緩沖區(qū)里的數(shù)據(jù)全部清掉,但卻起到了清空鍵盤緩沖區(qū)的效果减俏。
對了召烂,VC6的編譯器也可以使用。
移植性好娃承。
好了奏夫,主體就是上面的了。想了解更多历筝,多上網(wǎng)百度吧酗昼。
stdin標(biāo)準(zhǔn)輸入 stdout標(biāo)準(zhǔn)輸出 stdeer標(biāo)準(zhǔn)錯誤能了解這幾個可能會更好的理解輸入輸出。
當(dāng)然梳猪,這些只是我知道的方法麻削,還有不足,歡迎指正春弥、批評碟婆。