首先我們來看這樣一段**
#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...