在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。代码如下:
- #include <stdio.h>
- #include <conio.h>
- int main()
- {
- int ch, cha;
- ch = getch();
- cha = getchar();
- printf("ch=%d, cha=%d\n",ch,cha);
- getch();
- return 0;
- }
- ENTER ENTER
- 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()标准库函数。