getch()和getchar()之再讨论

时间:2022-12-31 11:47:20

原文:getch()和getchar()之再讨论

在C语言的字符处理函数中,getch()和getchar()是经常让人迷惑的两个函数,他们都有一些“奇怪的”特点让初学者摸不着头脑。两个函数有很多相似之处,却又有很大的不同。下面是两个函数的说明:

int getch( void ); Get a character from the console without echo

int getchar ( void );   Get character from stdin, Returns the next character from the standard input (stdin).It is equivalent to getc with stdin as its argument

可以看到,两个函数都没有参数,都是读入一个字符,返回值都是int型。但是注意getch()是从console读取,而getchar()是从stdin,一般是指键盘。要试验两者的区别,你可以写一个getch()看看不从键盘输入,比如直接用鼠标复制一段字符粘贴到console上,你会看到getch()会立即返回,但getchar一直等待,直到遇到 ENTER 键。

他们还有下面几个区别:

首先,getchar()是C的标准库函数,包含在头文件<stdio.h>中,而getch()需要的头文件是<conio.h>。

其次,getch()读到一个字符就返回,不管是什么字符,所以,在TC时代经常被放在程序最后面,达到“按任意键退出”的效果。而getchar()直到遇见ENTER 键才返回,返回值是第一个字符,但是后面的字符也不会被丢弃,而是保存在一个缓冲区内。

前几天,群里有人问getch()和getchar()的区别,原因是他键入enter后,前者返回13,而后者返回10。代码如下:

  1. #include <stdio.h>
  2. #include <conio.h>
  3. int main()
  4. {
  5. int ch, cha;
  6. ch = getch();
  7. cha = getchar();
  8. printf("ch=%d, cha=%d\n",ch,cha);
  9. getch();
  10. return 0;
  11. }
  12. ENTER ENTER
  13. ch=13, cha=10

复制代码

这里特别说明一下,这段代码是在windows平台下,才会产生如上所说的差异。原因是windows平台下ENTER键会产生两个转义字符 \r\n, 因此,getch()读到 \r 时就会返回他的ASCII码13。

奇怪的问题是为什么getchar()会返回10呢?前面不是说过返回第一个字符吗?

这的确会让人费解。实际上产生这个结果的原因是,getchar()把输入的 \r\n 转换成了 \n ,所以返回的是 \n 的ASCII码 10。为什么会这样呢?因为前面说过getchar()是C语言标准库函数,而在unix系统中ENTER键只产生 \n 。顺便说一下,在MAC OS中ENTER键将产生 \r ,同样也会被替换成 \n。这样,不管在什么平台下,getchar()都会得到相同的结果,所以说getchar()标准库函数。