scanf,getchar讀取字元和緩衝區

2021-10-16 09:16:47 字數 2142 閱讀 8517

首先我們來看這樣一段**

#include

intmain()

;printf

("請輸入密碼:");

scanf

("%s"

, password)

;printf

("請確認密碼(y/n):");

int ch =

getchar()

;if(ch ==

'y')

else

}

是不是有些同學會認為輸完密碼後,再輸入y就會列印出確認成功呢,但實際上卻並是這樣

可以看到程式並沒有等待我們輸入,就列印出了確認失敗,這就涉及到了對輸入緩衝區的理解,輸入緩衝區到底是什麼呢?

緩衝區:緩衝區又稱為快取,是記憶體空間的一部分。也就是說,在記憶體空間中預留了一定的儲存空間,這些儲存空間用來緩衝輸入或輸出的資料,這部分預留的空間就叫做緩衝區。

緩衝區根據其對應的輸入裝置還和輸出裝置,分為輸入緩衝區和輸出緩衝區

當我們從鍵盤輸入資料時,實際上將資料輸入到了輸入緩衝區,了解了緩衝區的概念,我們再來分析一下這個程式。在分析這個程式之前我們需要知道以下兩點知識。

scanf函式在讀取字元時遇到空格或者回車會停止讀取。

getchar()函式原型: int getchar(void)

當程式呼叫getchar()函式時,程式就等著使用者按鍵, 使用者輸入的字元被存放在鍵盤緩衝

區中,直到使用者按回車為止(回車字元也放在緩衝區中) 。當使用者鍵入回車之後,

getchar()函式 才開始從鍵盤緩衝區中每次讀入乙個字元 。也就是說, 後續的getchar()函

數呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完後,才

重新等待使用者按鍵 。

通俗一點說,當程式呼叫getchar()函式時,程式就等著使用者按鍵,並等使用者按下回車鍵返

回。期間按下的字元存放在緩衝區,第乙個字元作為函式返回值。繼續呼叫getchar()函

數,將不再等使用者按鍵,而是返回您剛才輸入的第2個字元;繼續呼叫,返回第3個字元

,直到緩衝區中的字元讀完後,才等待使用者按鍵。

getchar()函式的執行就是採用了行緩衝。第一次呼叫getchar()函式,會讓程式使用者(用

戶)輸入一行字元並直至按下回車鍵 函式才返回。此時使用者輸入的字元和回車符都存放

在行緩衝區。再次呼叫getchar()函式,會逐步輸出行緩衝區的內容。

確認失敗的原因:

當我們把 字元 1 2 3 4 5 6 \n敲入輸入緩衝區後,scanf讀取字元1 2 3 4 5 6放到password的陣列中

此時緩衝區裡還剩下乙個\n,然後getchar()函式將\n讀取給ch,ch不等於y,因此列印出確認失敗.

如何修改:

只要當getchar()讀取時,我們的緩衝區裡沒有字元,那麼getchar()就會等待我們輸入

修改以後**:

#include

intmain()

;printf

("請輸入密碼:");

scanf

("%s"

, password)

;printf

("請確認密碼(y/n):");

這裡的while迴圈的作用就是用來拿掉緩衝區裡多餘的字元,從而達到清空緩衝區的作用

好了,今天就講到這裡了,希望能對你們有所幫助

Qt讀取字元資訊亂碼

背景 使用某裝置讀取身份證資訊,在使用裝置自帶sdk在vs2008可以讀取正確,在qt讀取顯示亂碼。原因 vs2008裡面,預設是unicode編碼模式,而qt在windows下面預設是gbk編碼模式,所以顯示亂碼。解決方法 qbytearray byte idcarddata.name qtext...

C 讀取字串

我們在使用鍵盤輸入字串的時候,輸入流對於字串的讀取有幾種不同的實現方式。cin cin 在讀取字串時使用空白 空格 製表符和換行符 來確定字串的結束位置,這說明cin在獲取字元陣列輸入時只能讀取乙個單詞。而讀取該單詞後,cin將該字串放到陣列中,並在結果自動新增空字元。so,在某些時候,我們需要使用...

讀取字串長度

c 關於讀取乙個字串長度 包括空格回車 自用 方法1 include include using namespace std intmain 方法2 include include include include include using namespace std intmain 方法3 inc...