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键”。 这是为什么呢?理由是:
- getchar函数从stdin流中读取一个字符,即键盘缓冲区。而getch函数是从键盘直接读取一个字符。
- 在windows操作系统中,“电脑键盘上面的enter”代表两个字符'\r'和'\n','\r'是回车字符,'\n'是换行字符。
- 当你摁下enter键时,转化为标准的字符流时存储在键盘缓冲区,变成了'\n'字符。但是函数如果直接从键盘读取字符时,字符还没有来得及转换,读到字符'\r'。