各位大神求帶飛啊,怎樣用getch()收集用戶輸入的SPACE和ESC?
uj5u.com熱心網友回復:
(1) getch()和getche()函式這兩個函式都是從鍵盤上讀入一個字符。其呼叫格式為:
getch();
getche();
兩者的區別是: getch()函式不將讀入的字符回顯在顯示螢屏上, 而getche()
函式卻將讀入的字符回顯到顯示螢屏上。
例1:
#include<stdio.h>
main()
{
char c, ch;
c=getch(); /*從鍵盤上讀入一個字符不回顯送給字符變數c*/
putchar(c); /*輸出該字符*/
ch=getche(); /*從鍵盤上帶回顯的讀入一個字符送給字符變數ch*/
putchar(ch);
}
利用回顯和不回顯的特點, 這兩個函式經常用于互動輸入的程序中完成暫停
等功能。
例2:
#include<stdio.h>
main()
{
char c, s[20];
printf("Name:");
gets(s);
printf("Press any key to continue...");
getch(); /*等待輸入任一鍵*/
}
(2) getchar()函式
getchar()函式也是從鍵盤上讀入一個字符, 并帶回顯。它與前面兩個函式
的區別在于: getchar()函式等待輸入直到按回車才結束, 回車前的所有輸入字
符都會逐個顯示在螢屏上。但只有第一個字符作為函式的回傳值。
getchar()函式的呼叫格式為:
getchar();
例3:
#include<stdio.h>
main()
{
char c;
c=getchar(); /*從鍵盤讀入字符直到回車結束*/
putchar(c); /*顯示輸入的第一個字符*/
getch(); /*等待按任一健*/
}
例4
#include<stdio.h>
main()
{
char c;
while ((c=getchar())!='/n') /*每個getchar()依次讀入一個字符*/
printf("%c",c); /*按照原樣輸出*/
getch(); /*等待按任一健*/
}
再說下檔案尾部getch();的原因。
首先不要忘了,要用getch()必須引入頭檔案conio.h,以前學C語言的時候,我們總喜歡用在程式的末尾加上它,利用它來實作程式運行完了暫停不退出的效果。如果不加這句話,在TC2.0的環境中我們用Ctrl+F9編譯并運行后,程式一運行完了就退回到TC環境中,我們根本來不及看到結果,這時要看結果,我們就要按Alt+F5回到DOS環境中去看結果,這很麻煩。而如果在程式的結尾加上一行getch();陳述句,我們就可以省掉會DOS看結果這個步驟,因為程式運行完了并不退出,而是在程式最后把螢屏停住了,按任意鍵才退回到TC環境中去。那我們來看看getch()到底起的什么作用,getch()實際是一個輸入命令,就像我們用cin>>的時候程式會停下來等你輸入,和cin不同的是,getch()的作用是從鍵盤接收一個字符,而且并不把這個字符顯示出來,就是說,你按了一個鍵后它并不在螢屏上顯示你按的什么,而繼續運行后面的代碼,所以我們在C++中可以用它來實作“按任意鍵繼續”的效果,即程式中遇到getch();這行陳述句,它就會把程式暫停下來,等你按任意鍵,它接收了這個字符鍵后再繼續執行后面的代碼。
你也許會問,為什么我們在C++中就沒有在程式的末尾加上getch(),解釋是,軟體總是不斷更新的,不好的地方當然要進行改正,getch()加在程式末尾,它又不賦值給任何變數,所以它在這個地方完全是垃圾代碼,與程式無關。C++中考慮到這一點,于是在每次程式運行完了并不退出,而是自動把螢屏停下來,并顯示“press any key...”叫你按任意鍵退出,這就好比C++在它的環境中運行程式,在程式的末尾自動加上了一行getch();陳述句,并且在這行陳述句前還添加了一行輸出陳述句cout<<"press any key...";來提示你程式結束了,按任意鍵繼續。實際上我們編譯好的程式在程式結束了本身是不會停下來的,我們可以在編譯產生的Debug目錄中找到這個編譯好的應用程式(擴展名exe),在檔案夾中雙擊運行它,你會發現螢屏閃了一下MS-DOS視窗就關閉了,因為程式運行完就自動退出了,回到了windows環境,當然,如果我們在DOS環境中運行這個程式,我們就可以直接在看到DOS螢屏上看到程式運行結果,因為程式運行完后并不清屏。
還有一個陳述句,和getch()很相似,getche(),它也需要引入頭檔案conio.h,那它們之間的區別又在哪里呢?不同之處就在于getch()無回傳顯示,getche()有回傳顯示。怎么說呢?我舉個例子你就明白了。
--------------------------------------
#include<stdio.h>
#include<conio.h>
void main()
{
char ch;
for(int i=0;i<5;i++)
{
ch=getch();
printf("%c",ch);
}
}
--------------------------------------
這里輸入輸出我用的是C的函式庫,沒有用C++的iostream.h,這個我等會再說。首先這是個連續5次的回圈來實作5次停頓,等待我們輸入,我們編譯并運行這個程式,假設我們分別輸入abcde,螢屏上顯示的結果是abcde,這個abcde并不是在ch=getch();中輸出的,我們把printf("%c",ch);這行陳述句去掉,就會發現我們按5次任意鍵程式就結束了,但螢屏上什么都沒有顯示。
然后我們在把代碼中的getch()換成getche()看看有什么不同,我們還是分別輸入abcde,這時螢屏上顯示的結果是aabbccddee,我們把printf("%c",ch);這行陳述句再去掉看看,顯示的結果就是abcde了,說明程式在執行ch=getche();這條陳述句的時候就把我們輸入的鍵回傳顯示在螢屏上,有無回顯就是它們的唯一區別。
好了,我們再來說說為什么不用C++函式庫的原因。你可以試試把這個程式改成C++的形式:
--------------------------------------
#include<iostream.h>
#include<conio.h>
void main()
{
char ch;
for(int i=0;i<5;i++)
{
ch=getch();
cout<<ch;
}
}
--------------------------------------
你會發現運行結果是完全不同的,說實話我也搞不清它是怎么編譯運行的,以前我在C++中用它來實作任意鍵繼續的功能就發現了這個問題。如果在getch();后面有個cout<<"……";陳述句的話他會先執行下面的cout<<"……";然后再執行getch();實作停頓,有時再兩個陳述句中間加上一個cout<<endl;可以解決這個問題,但如果用C中的printf()就從沒有出現過這種問題。至于到底是為什么,我也不知道,只能猜想,可能是因為getch()是C的函式庫中的函式,在C++中不怎么好用,就是說是編譯系統本身的問題,與我們寫的程式沒有關系。不知道我分析是不是正確的,還希望高手能予以指點,謝謝!
有人會說,既然是C的函式庫中的,那么就應該淘汰了,我們還研究它,還用它干嘛?但是我發現還是有用著它的地方,否則我也不會在這里說這么多來耽誤大家的時間。我就舉個例子吧,程式如下:
--------------------------------------
#include<stdio.h>
#include<conio.h>
void main()
{
char ch='*';
while(ch=='*')
{
printf("/n按 * 繼續回圈,按其他鍵退出!");
ch=getch();
}
printf("/n退出程式!");
}
--------------------------------------
我們可以在這個回圈體中添加我們想要的功能,程式中按*繼續回圈,其他任意鍵退出,而且利用getch()無回顯的特性,我們不管按什么,都不會在螢屏上留下痕跡,使我們的界面達到美觀效果,如果還有更好的辦法實作這個功能,我可能就不會在這里提這么多了。如果你真的有更好的辦法,請一定告訴我,謝謝!
下面我把別人網頁上的幾個例子轉載如下:
--------------------------------------
//例一:這個例子是為了說明getch()和getche()的區別
#include<stdio.h>
#include<conio.h>
//這里講個小故事:因為這個代碼是在別人網頁上的,別人用的C環境,可能是不需要conio.h頭檔案
//就可以用getch();(我就不清楚了),也可能是忘了寫,網頁上的源代碼沒有#include<conio.h>這一行,
//我讓老婆去看這個網頁,老婆把網頁上的代碼復制到C++環境中,不能編譯就跟我哭,
//呵呵,我可愛的傻老婆!
void main()
{
char c, ch;
c=getch(); /*從鍵盤上讀入一個字符不回顯送給字符變數c*/
putchar(c); /*輸出該字符*/
ch=getche(); /*從鍵盤上帶回顯的讀入一個字符送給字符變數ch*/
putchar(ch);
printf("/n/n");
}
--------------------------------------
//例二:這個例子是演示互動輸入的程序中完成暫停功能
#include<stdio.h>
#include<conio.h>
void main()
{
char c, s[20];
printf("Name:");
gets(s);
printf("Press any key to continue.../n/n");
getch(); /*等待輸入任一鍵*/
printf("/n/n");
}
--------------------------------------
//例三:getchar()函式也是從鍵盤上讀入一個字符,并帶回顯。它與前面兩個函式的區別在于:
// getchar()函式等待輸入直到按回車才結束,回車前的所有輸入字符都會逐個顯示在螢屏上。
// 但只有第一個字符作為函式的回傳值。
#include<stdio.h>
#include<conio.h>
void main()
{
char c;
c=getchar(); /*從鍵盤讀入字符直到回車結束*/
//getchar()在這里它只回傳你輸入字串的第一個字符,并把回傳值賦值給c
putchar(c); /*顯示輸入的第一個字符*/
printf("/n/n");
}
--------------------------------------
//例四:呵呵,這個程式你運行一下,相信你又會有疑問了
#include<stdio.h>
#include<conio.h>
void main()
{
char c;
while ((c=getchar())!='/n') /*每個getchar()依次讀入一個字符*/
printf("%c",c); /*按照原樣輸出*/
printf("/n/n");
}
--------------------------------------
例四的程式運行時,首先停下來,等你輸入一串字串,輸入完畢后,它把你輸入的整個字串都輸出來了,咦,你不是說getchar()只回傳第一個字符么,這里怎么?
不要急,我慢慢跟你解釋,忍耐一下,馬上就講完了。因為我們輸入的字串并不是取了第一個字符就把剩下的字串丟掉了,它還在我們的記憶體中,就好比,開閘放水,我們把水放到閘里去以后,開一次閘就放掉一點,開一次就放掉一點,直到放光了為止,我們輸入的字串也是這么一回事,首先我們輸入的字串是放在記憶體的緩沖區中的,我們呼叫一次getchar()就把緩沖區中里出口最近的一個字符輸出,也就是最前面的一個字符輸出,輸出后,就把它釋放掉了,但后面還有字串,所以我們就用回圈把最前面的一個字符一個個的在記憶體中釋放掉,直到不滿足回圈條件退出為止。例子中回圈條件里的'/n'實際上就是你輸入字串后的回車符,所以意思就是說,直到遇到回車符才結束回圈,而getchar()函式就是等待輸入直到按回車才結束,所以實作了整個字串的輸出。當然,我們也可以把回圈條件改一下,比如while ((c=getchar())!='a'),什么意思呢,意思就是遇到字符'a'就停止回圈。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108681.html
上一篇:如何根據TRichEdit中文本行數動態獲取TRichEdit的高度。
下一篇:公交查詢系統設計
