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'。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章