getchar()知多少?

licup123發表於2010-12-25

getc():
呼叫方式:int getc(FILE *stream)
它返回指定輸入流stream的當前位置的下一個字元,並增加檔案的位置指示器.

getch():
呼叫方式:int getch(void)
getch()從控制檯讀取一個字元,但不把該字元顯示在螢幕上,也就是不回顯.

getche():
呼叫方式:int getche(void)
getchar()從控制檯讀取一個字元,把該字元顯示在螢幕上,也就是回顯.

getchar():
調有方式:int getchar(void)
getchar()從控制檯讀取一個字元,並回顯,它和getch(),getche()的不同在於,它等到輸入一個回車才結束,就算你輸入了一個字串,它也只取其中的第一個字元.





void main()
{
  char c, ch;
  c=getch(); /*從鍵盤上讀入一個字元不回顯送給字元變數c*/
  putchar(c); /*輸出該字元*/
  ch=getche(); /*從鍵盤上帶回顯的讀入一個字元送給字元變數ch*/
  putchar(ch);
  printf("\n\n");
}

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

  還有getchar是很值得研究的:getchar()是stdio.h中的庫函式,它的作用是從stdin流中讀入一個字元,也就是說,如果stdin有資料的話不用輸入它就可以直接讀取了。而getch()和getche()是conio.h中的庫函式,它的作用是從鍵盤接收字元。getchar帶有顯示。

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

#include
#include
void main()
{
  char c;
  c=getchar(); /*從鍵盤讀入字元直到回車結束*/
  //getchar()在這裡它只返回你輸入字串的第一個字元,並把返回值賦值給c
  putchar(c); /*顯示輸入的第一個字元*/
  printf("\n\n");
}

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

#include

#include

void main()

{

  char c;

  while ((c=getchar())!='\n') /*每個getchar()依次讀入一個字元*/

  printf("%c",c); /*按照原樣輸出*/

  printf("\n\n");

}

程式執行時,首先停下來,等你輸入一串字串,輸入完畢後,它把你輸入的整個字串都輸出來了,咦,你不是說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',並按下Enter鍵以後。首先得到回車符。那個getchar函式結束了。 但是還存在一個換行符。所以如果用getchar()來做判斷的時候。最好再寫一次getchar()清除緩衝區的'\n'.

 

getchar有一個int型的返回值.當程式呼叫getchar時.程式就等著使用者按鍵.使用者輸入的字元被存放在鍵盤緩衝區中.直到使用者按回車為止(回車字元也放在緩衝區中).getchar函式的返回值是使用者輸入的第一個字元的ASCII碼,如出錯返回- 1,且將使用者輸入的字元回顯到螢幕.如使用者在按回車之前輸入了不止一個字元,其他字元會保留在鍵盤快取區中,等待後續getchar呼叫讀取.也就是說, 後續的getchar呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完為後,才等待使用者按鍵.
  getch與 getchar基本功能相同,差別是getch直接從鍵盤獲取鍵值,不等待使用者按回車,只要使用者按一個鍵,getch就立刻返回,getch返回值是使用者輸入的ASCII碼,出錯返回-1.輸入的字元不會回顯在螢幕上.getch函式常用於程式除錯中,在除錯時,在關鍵位置顯示有關的結果以待檢視,然後用 getch函式暫停程式執行,當按任意鍵後程式繼續執行.
getch()、getche()和getchar()函式

(1) getch()和getche()函式
 這兩個函式都是從鍵盤上讀入一個字元。其呼叫格式為:
  getch(); 
  getche();
 兩者的區別是:getch()函式不將讀入的字元回顯在顯示螢幕上,而getche() 函式卻將讀入的字元回顯到顯示螢幕上。 

  例1:
  #include"stdio.h"
  #include"conio.h"
  void main()
  {
  char c, ch;
  c=getch(); /*從鍵盤上讀入一個字元不回顯送給字元變數c*/
  putchar(c); /*輸出該字元*/
  ch=getche(); /*從鍵盤上帶回顯的讀入一個字元送給字元變數ch*/
  putchar(ch);
  }

 利用回顯和不回顯的特點, 這兩個函式經常用於互動輸入的過程中完成暫停等功能。 
  例2: 
  #include"stdio.h"
  #include"conio.h"
  void main() 
  {
  char s[20];
  printf("Name:");
  gets(s);
  printf("Press any key to continue...");
  getch(); /*等待輸入任一鍵*/
  } 
  
(2) getchar()函式
 getchar()函式也是從鍵盤上讀入一個字元, 並帶回顯。它與前面兩個函式的區別在於: getchar()函式等待輸入直到按回車才結束, 回車前的所有輸入字元都會逐個顯示在螢幕上。但只有第一個字元作為函式的返回值。

  例3: 
  #include"stdio.h"
  #include"conio.h"
  void main() 
  {
  char c;
  c=getchar(); /*從鍵盤讀入字元直到回車結束*/
  putchar(c); /*顯示輸入的第一個字元*/
  getch(); /*等待按任一健*/
  } 

  例4:
  #include"stdio.h"
  #include"conio.h"
  void main() 
  {
  char c;
  while ((c=getchar())!='\n') /*每個getchar()依次讀入一個字元*/
  printf("%c",c); /*按照原樣輸出*/
  getch(); /*等待按任一健*/ 
  }


 程式設計中,以防程式執行一閃即失,總是要在最後來一個“getch();”
 getch()和getche()需要"conio.h"

附:
getch 從鍵盤無回顯地讀一字元
呼叫格式 #include"stdio.h"
  int getch(void);
原型在 conio.h
說明 getch從鍵盤直接讀一個字元,不回顯到螢幕上。
返回值 getch返回從鍵盤所讀的字元。
可移植性 getch只適用於DOS

getchar 從stdin流中取字元
呼叫格式 #include"conio.h"
  int getchar(void);
原型在 stdio.h
說明 getchar是一個巨集,用於返回指定的stdin輸入流的下一個字元, 它定義為getc(stdin)。
返回值 呼叫成功時,getchar返回所讀的字元,它已被轉換為無符號擴充套件的整形值。在遇到檔案結束或出錯時,返回EOF。
可移植性 getchar適用於UNIX系統,在ANSI C中定義,與Kernighan和Ritchie的定義相容

其他相關連結
stdio.h中宣告的是標準輸入輸出函式,一般在各種系統上都能使用。
io.h中宣告的是類UNIX輸入輸出函式,在DOS,windows下雖然能編譯過去,但不起作用。
conio.中宣告的是類DOS輸入輸出函式,有些好像在UNIX下可以用,比如getch,記得以前好像在unix上用過。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10697500/viewspace-682595/,如需轉載,請註明出處,否則將追究法律責任。

相關文章