密碼不回顯函式(二)

2021-07-31 12:25:05 字數 2455 閱讀 4246

值得注意的是前面兩個函式都是從鍵盤讀入資料!

還有getchar是很值得研究的:getchar()是stdio.h中的庫函式,它的作用是從stdin流中讀入乙個字元,也就是說,如果stdin有資料的話不用輸入它就可以直接讀取了。

而getch()和getche()是conio.h中的庫函式,它的作用是從鍵盤接收字元。getchar帶有顯示。

與前面兩個函式的區別在於: getchar()函式等待輸入直到按回車才結束(前提是緩衝區沒有資料),回車前的所有輸入字元都會逐個顯示在螢幕上。

但只有第乙個字元作為函式的返回值。

[cpp]view plain

copy

#include

#include

void

main()    

例四:呵呵,這個程式你執行一下,相信你又會有疑問了。這個就是從緩衝區中讀取了例子。第一次getchar()時,確實需要人工的輸入,但是如果你輸了多個字元,

以後的getchar()再執行時就會直接從緩衝區中讀取了。

[cpp]view plain

copy

#include

#include

void

main()    

程式執行時,首先停下來,等你輸入一串字串,輸入完畢後,它把你輸入的整個字串都輸出來了,咦,你不是說getchar()只返回第乙個字元麼,這裡怎麼?

因為我們輸入的字串並不是取了第乙個字元就把剩下的字串丟掉了,它還在我們的記憶體中,就好比,開閘放水,我們把水放到閘裡去以後,開一次閘就放掉一點,

開一次就放掉一點,直到放光了為止,這裡開閘動作就相當於呼叫一次getchar()。我們輸入的字串也是這麼一回事,首先我們輸入的字串是放在記憶體的緩衝區中的,

我們呼叫一次getchar()就把緩衝區中里出口最近的乙個字元輸出,也就是最前面的乙個字元輸出,輸出後,就把它釋放掉了,但後面還有字串,

所以我們就用迴圈把最前面的乙個字元乙個個的在記憶體中釋放掉,直到不滿足迴圈條件退出為止。

例子中迴圈條件裡的'/n'實際上就是你輸入字串後的回車符,所以意思就是說,直到遇到回車符才結束迴圈,

而getchar()函式就是等待輸入(或緩衝區中的資料)直到按回車才結束,所以實現了整個字串的輸出。當然,我們也可以把迴圈條件改一下,

比如while ((c=getchar())!='a'),什麼意思呢,意思就是遇到字元'a'就停止迴圈,當然意思是如果你輸入「12345a213123/n」那麼只會輸出到a,結果是12345a。

再次注意:用getchar()它是從「流」中間去讀取,所以第乙個getchar()接受的是剛剛中斷的流佇列中即將出列的第乙個字元(不限於回車符,上面舉過例子了),

如果流佇列不為空,執行getchar()就繼續放水,直到把回車符也放空為止,空了之後再在執行getchar()就停下等待你的輸入了;

我們用getch()為什麼每次都是等待使用者的輸入呢?因為getch()是從鍵盤接收,即時的接收,並不是從stdin流中去讀取資料。

補充:按鍵盤上的回車產生了2個字元:回車符('/r')和換行符('/n')。回車符'/r'(cr:carriage return:倒車)使游標回到這行的首部,

換行符('/n')(new line)然後再換行。

所以當輸入字元'w',並按下回車鍵以後。首先得到回車符。那個getchar函式結束了。 但是還存在乙個換行符。所以如果用getchar()來做判斷的時候。

最好再寫一次getchar()清除緩衝區的'/n'.

如果我想讓getchar()每次都能夠等待使用者輸入的話就要清空緩衝區,下面就介紹方法(不同平台)

c標準規定 fflush()函式是用來重新整理輸出(stdout)快取的。對於輸入(stdin),它是沒有定義的。但是有些編譯器也定義了 fflush( stdin )的實現,

比如微軟的vc。其它編譯器是否也定義了 fflush( stdin )的實現應當查詢它的手冊。gcc編譯器沒有定義它的實現,所以不能使用 fflush( stdin )來重新整理輸入快取。

對於沒有定義 fflush( stdin )的編譯器,可以使用 fgets()函式來代替它(比用 getchar()、scanf()等函式通用性好)。

可以這樣忽略輸入流中留下的回車等其它輸入,從而使下一次的輸入總保持乙個「乾淨」的狀態。(這個是任何平台下都可以的)

[cpp]view plain

copy

// ...

char

sbuf[1024];  

// ...

fgets( sbuf, 1024, stdin );  

// ...

在windows 的vc下面就可以這樣了:  

for(

inti=0;i<10;++i)    

主要看getch(),getche()的是否顯示,getchar()是讀取流,而且和前面兩個函式不是乙個庫。掌握清空緩衝區的方法。

Unix 不回顯輸入密碼

原帖見 http blog.163.com xiaolei li blog static 114404451200911172155783 在軟體開發中,往往會遇到要求使用者輸入密碼的情況。出於對密碼的保密,輸入的字元是不會顯示到螢幕上的。例如,在登入linux系統時,輸入使用者名稱後,輸入的密碼是...

C 輸入密碼(字元)不回顯

1.中有乙個 getch 函式,當使用它的時候不會回顯字元。2.如下,r 表示回車符 b 表示退格符,當按下 backspace 時就是輸入了 b 退格的意思是游標往前一格,而原來位置顯示的字元不變,所以判斷若輸入非退格符則顯示 並且將ch讀入到password中 若為退格符,則需先顯示 b 使得游...

getpass 函式 螢幕輸入不回顯

環境 vmware workstation centos 6.4 x86 64 說明 讀寫使用者輸入,螢幕不回顯 char getpass const char prompt getpass用於從鍵盤讀取使用者輸入,但螢幕不回顯。引數prompt為螢幕提示字元。函式返回值為使用者鍵盤輸入的字串。螢幕...