getch(),getche(),getchar()的區別 (綜合轉)

 

先說基本區別。

(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'就停止循環。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章