1.關于getch() getchar() getche()
getch(): 所在頭文件:conio.h 函數用途:從控制臺讀取一個字符,,但不顯示在屏幕上 例如: 用getch();會等待你按下任意鍵,,再繼續(xù)執(zhí)行下面的語句,; 用ch=getch();會等待你按下任意鍵之后,,把該鍵字符所對應的ASCII碼賦給ch,再執(zhí)行下面的語句,。
函數名: getche
函數名:getchar 而對于getchar,,我們知道getchar有一個int型的返回值.當程序調用getchar時.程序就等著用戶按鍵.用戶輸入的字符被存放在鍵盤緩沖區(qū)中.直到用戶按回車為止(回車字符也放在緩沖區(qū)中).當用戶鍵入回車之后,getchar才開始從stdio流中每次讀入一個字符.getchar函數的返回值是用戶輸入的第一個字符的ASCII碼,如出錯返回-1,且將用戶輸入的字符回顯到屏幕.如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區(qū)中,等待后續(xù)getchar調用讀取.也就是說,后續(xù)的getchar調用不會等待用戶按鍵,而直接讀取緩沖區(qū)中的字符,直到緩沖區(qū)中的字符讀完為后,才等待用戶按鍵. getch與getchar基本功能相同,差別是getch直接從鍵盤獲取鍵值,不等待用戶按回車,只要用戶按一個鍵,getch就立刻返回, getch返回值是用戶輸入的ASCII碼,出錯返回-1.輸入的字符不會回顯在屏幕上.getch函數常用于程序調試中,在調試時,在關鍵位置顯示有關的結果以待查看,然后用getch函數暫停程序運行,當按任意鍵后程序繼續(xù)運行. 這個版本忽略了個重點,,getch()是非緩沖輸入函數,就是不能用getch()來接受緩沖區(qū)已存在的字符,,如以下C++程序,, int i;while(cin>>i);cin.clear();getchar();運行時如果輸入1 2 3 a時必須用getchar()才能在后面程序獲得正常輸入,即使先前已經恢復流了,,此處用getch()是萬萬不行的,。---這一段從百度詞條看到,不是很明白c++中字符串輸入規(guī)則 getchar This is a standard function that gets a character from the stdin. getch This is a nonstandard function that gets a character from keyboard, does not echo to screen. getche This is a nonstandard function that gets a character from the keyboard, echoes to screen. Use getchar if you want it to work on all compilers. Use getch or getche on a system that supports it when you want keyboard input without pressing [Enter].And note that the return value of all three is int! You need this to properly check for EOF. 結合實際,,談談具體的區(qū)別與用法: getchar()函數只有在滿足輸入次數要求的前提下,,遇到回車時才結束輸入,之前所有的字符都會逐個顯示在屏幕上,,但是只有第一個字符返回一個ASCII碼,。 具體的過程就是getchar()被調用時,程序就等著用戶按鍵,,且將用戶輸入的字符依次回顯到屏幕,,用戶必須摁完規(guī)定的次數(循環(huán)語句)(即使是回車也要摁),所有的字符都會保留在鍵盤緩存區(qū)中(回車字符也放在緩存區(qū)中),,等待后續(xù)getchar調用讀取,。也就是說,后續(xù)的getchar調用不會等待用戶按鍵,,而直接讀取緩沖區(qū)中的字符,直到讀完規(guī)定的次數后(并不是讀完緩沖區(qū)的字符),,才等待用戶按鍵。 getch()函數任何時候遇到回車鍵都能結束,,而且不會回顯輸入的字符,,但是每輸入一個字符都會立即返回一個ASCII碼。具體的過程就是,,每摁一次鍵就調用一次getch(),,直到遇回車結束。如果在規(guī)定次數前結束,,系統論并沒有存入結束符,,我們要手動地在他末尾添加一個‘\0’字符。這個也好理解,,其實getchar()就相當于是翻譯型的,,他連回車字符也給翻譯了,然后一起存入;而getch()是解釋型的,,每輸入一條就翻譯,,然后存入,遇回車字符時剛翻譯完是回車,,所以他就得退出了,。 getch函數常用于程序調試中,在調試時,,在關鍵位置顯示有關的結果以待查看,,然后用getch函數暫停程序運行,當按任意鍵后程序繼續(xù)運行,。 我們看一個具體的例子: Int i; char tmp[20]; for ( i="0" ; i<20; i++ ) { tmp[i] = getch() ; //關鍵點1 // tmp[i]=getchar(); // putchar ( '*' ) ; printf ( "%d=[%c]\n",i,tmp [i] ) ; if ( tmp[i] == '\r' ) { tmp [i] = '\0' ; //關鍵點2 break ; } } 大家先分析下上面這段代碼的功能吧,,這是一個最多為20位的密碼輸入功能,既然是密碼我們當然不希望他顯示原字符,,像linux用戶驗證那樣什么也不顯示,,但有的時候為了直觀一點,我們可以加入putchar(‘*’)語句,,就像QQ密碼在你每輸入一個字符時,,他就回顯一個“*”號。大家不防把上面的代碼敲一邊,,自己運行試試。 接著上面的問題,,為什么說讀完規(guī)定的次數呢,,實例中的for循環(huán)了20次,但我們在輸入的時候可以輸入30,,50個字符,,對系統來說反正是放入緩沖區(qū),放多少都是放,,只不過在讀取的時候只循環(huán)了20次,,所以只能多20個字符,剩下的就被拋棄了,。但是如果我們只想輸入10個字符,,那么你就得摁剩下的10個回車鍵,因為getchar()輸入的字符被存放在鍵盤緩沖區(qū)中.直到用戶輸入足夠的次數(20次)按回車后才返回,。因為在20次前,,回車也是當做一個普通字符存入緩存區(qū)的。 也就是說,,如果你的按鍵超過20次getch()自動結束,,而getchar()沒有任何提示,但在下次調用時只取前20個有效字符。如果你的按鍵不足20次,,getch()遇到回車就退出,,但是getchar()你必須按足20次后遇回車才結束, 細心的朋友會發(fā)現,,調用getchar()時真正輸入的字符只有19個,,因為系統默認把第一個字符設為‘\0’. 至于getche()函數用法那就很明了了,跟getch()唯一的不同點就是getche() 函數卻將讀入的字符回顯到顯示屏幕上,。 為什么getch獲取的enter鍵值是\r,,而getchar是\n呢? \r 是回車,,return,,意思就是“回到行首” \n 是換行,newline,,意思就是“另起一行” 我們在平時使用電腦時,,已經習慣了回車和換行一次搞定,敲一個回車鍵,,即是回車,,又是換行,但在早期的打字機上,,要另起一行打字需要兩個步驟,,首先要發(fā)送命令"\r”將打字頭復位,即回車,;然后再發(fā)送命令"\n”讓打字機走紙移到下一行,。 getch()不是ANSI里的標準庫函數,這是歷史遺留問題,,按照上述步驟,,是先發(fā)送"\t",所以getch獲取的enter鍵值是\r,。 getchar()是標準庫函數,,既“敲一個回車鍵,即是回車,,又是換行”,,而現在的“\n“表示既回車又換行的意思。 看看下面的函數: #include<stdio.h> 我們運行程序,輸入:the string is xiongwei;回車;可以看到輸出: ch is :t the string is xiongwei; 此時這個字符串并沒有追加到xw.c中. 只有當輸入'#'時,程序才結束,打開xw.c文件可以看到字符串已經追加到文件中. 第一次按回車時,ch 從鍵盤緩沖區(qū)讀取一個字母,并且打印出來,說明循環(huán)體之外的getchar()函數已經讀取完畢,既其結束條件已經滿足;而下面的循環(huán)體需要遇到’#’才算結束條件,所以下面輸入的所有字符,全都送入鍵盤緩沖區(qū),直到遇到’#’才結束輸入(輸入次數已到),開始讀取緩沖區(qū)中的內容.而需要注意的是:putchar()函數,其不管遇到結束符與否,只要有回車,就會把相應的緩沖區(qū)中的內容打印出來. |
|