getchar() 與 getch()

getchar()與getch()這兩個函數都是讀一個字符,但是它們有一個重要的差別,下面我在vs2010平臺舉例子來說明:

example_01.c
#include<stdio.h>
#include<conio.h>
int main(void)
{
   char ch;
   while((ch=getchar()) != '\n')
   {
      putchar(ch);
   }
   return   0;
}

這個小程序需要一直輸入字符,直到“你摁下電腦鍵盤上的enter鍵”程序才結束;

example_02.c
#include<stdio.h>
#include<conio.h>
int  main(void)
{
  char  ch;
  while((ch=getch()) != '\n')
  {
    putchar(ch);
  }
  return  0;
}

而這個程序卻會陷入死循環,不論你摁什麼鍵,包括“電腦鍵盤上的enter鍵”。但是如果你把example_02.c程序中的'\n'換成'\r',那麼這個程序在你摁下“你電腦鍵盤上面的enter鍵”後跳出while循環,此時,example_01.c與example_02.c功能一樣。現在我們再舉兩個例子:

example_11.c
#include<stdio.h>
#include<conio.h>
int  main(void)
{
  char ch;
  while((ch=getchar()) != '\r')
  {
    putchar(ch);
  }
  return  0;
}
example_12.c
#include<stdio.h>
#include<conio.h>
int  main(void)
{
   char ch;
   while((ch=getch()) != '\r')

   {
      putchar(ch);
   }
   return  0;
}

example_11.c陷入了死循環,除非你能在“你電腦鍵盤上面輸入'\r'字符”。反正我沒有找到。example_12.c可以正常工作,它提示你輸入字符,直到你輸入“電腦鍵盤上面的enter鍵”。 這是爲什麼呢?理由是: 

  1. getchar函數從stdin流中讀取一個字符,即鍵盤緩衝區。而getch函數是從鍵盤直接讀取一個字符。
  2. 在windows操作系統中,“電腦鍵盤上面的enter”代表兩個字符'\r'和'\n','\r'是回車字符,'\n'是換行字符。
  3. 當你摁下enter鍵時,轉化爲標準的字符流時存儲在鍵盤緩衝區,變成了'\n'字符。但是函數如果直接從鍵盤讀取字符時,字符還沒有來得及轉換,讀到字符'\r'。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章