getch(),getche(),getchar()的区别

 

getchar()和getch()的问题一直困扰着大家,关于他们的区别也是众说纷纭,可没有一种说法是详细、深入的,今天我就在前人已有的成果上,试着与大家继续探讨下这个问题:


    先看看规范点的说法:

        getchar

    This is a standard function that gets a character from the stdin.

    getch

    This is a nonstandard function that gets a character from keyboard, does not echo to screen.

    getche

    This is a nonstandard function that gets a character from the keyboard, echoes to screen.


Use getchar if you want it to work on all compilers. Use getch or getche on a system that supports it when you want keyboard input without pressing [Enter].And note that the return value of all three is int! You need this to properly check for EOF.


    结合实际,谈谈具体的区别与用法:


    getchar()函数只有在满足输入次数要求的前提下,遇到回车时才结束输入,之前所有的字符都会逐个显示在屏幕上,但是只有第一个字符返回一个ASCII码。


具体的过程就是getchar()被调用时,程序就等着用户按键,且将用户输入的字符依次回显到屏幕,用户必须摁完规定的次数(循环语句)(即使是回车也要摁),所有的字符都会保留在键盘缓存区中(回车字符也放在缓存区中),等待后续getchar调用读取。也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到读完规定的次数后(并不是读完缓冲区的字符),才等待用户按键。通常读到回车为止,即while((c=getchar())!='/n'){ }



    getch()函数任何时候遇到回车键都能结束,而且不会回显输入的字符,但是每输入一个字符都会立即返回一个ASCII码。具体的过程就是,每摁一次键就调用一次getch(),直到遇回车结束。如果在规定次数前结束,系统论并没有存入结束符,我们要手动地在他末尾添加一个‘/0’字符。 这个也好理解,其实getchar()就相当于是翻译型的,他连回车字符也给翻译了,然后一起存入;而getch()是解释型的,每输入一条就翻译,然后存入,遇回车字符时刚翻译完是回车,所以他就得退出了。


getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行。



我们看一个具体的例子:

int i; char tmp[20]; for ( i=0 ; i<20; i++ ) { tmp[i] = getch() ; //关键点1 // tmp[i]=getchar(); // putchar ( '*' ) ; printf ( "%d=[%c]/n",i,tmp [i] ) ; if ( tmp[i] == '/r' ) { tmp [i] = '/0' ; //关键点2 break ; } } }  

大家先分析下上面这段代码的功能吧,这是一个最多为20位的密码输入功能,既然是密码我们当然不希望他显示原字符,像linux用户验证那样什么也不显示,但有的时候为了直观一点,我们可以加入putchar(‘*’)语句,就像QQ密码在你每输入一个字符时,他就回显一个“*”号。大家不防把上面的代码敲一边,自己运行试试。



接着上面的问题,为什么说读完规定的次数呢,实例中的for循环了20次,但我们在输入的时候可以输入30,50个字符,对系统来说反正是放入缓冲区,放多少都是放,只不过在读取的时候只循环了20次,所以只能多20个字符,剩下的就被抛弃了。但是如果我们只想输入10个字符,那么你就得摁剩下的10个回车键,因为getchar()输入的字符被存放在键盘缓冲区中.直到用户输入足够的次数(20次)按回车后才返回。因为在20次前,回车也是当做一个普通字符存入缓存区的。


也就是说,如果你的按键超过20次getch()自动结束,而getchar()没有任何提示,但在下次调用时只取前20个有效字符。如果你的按键不足20次,getch()遇到回车就退出,但是getchar()你必须按足20次后遇回车才结束,


至于getche()函数用法那就很明了了,跟getch()唯一的不同点就是getche() 函数却将读入的字符回显到显示屏幕上。




为什么getch获取的enter键值是/r,而getchar是/n呢?


/r 是回车,return,意思就是“回到行首”
/n 是换行,newline,意思就是“另起一行”
我们在平时使用电脑时,已经习惯了回车和换行一次搞定,敲一个回车键,即是回车,又是换行,但在早期的打字机上,要另起一行打字需要两个步骤,首先要发送命令"/r”将打字头复位,即回车;然后再发送命令"/n”让打字机走纸移到下一行。
getch()不是ANSI里的标准库函数,这是历史遗留问题,按照上述步骤,是先发送"/t",所以getch获取的enter键值是/r。
getchar()是标准库函数,既“敲一个回车键,即是回车,又是换行”,而现在的“/n“表示既回车又换行的意思。

 

 

1.getch()
从标准输入设备(键盘)读入一个字符,不回显在显示器上.
例码:
# include <conio.h> # include <iostream.h> # include <stdio.h> int main() { char ch; printf("请输入一个字符: "); ch = getch(); //在输入字符的时候,屏幕上并看不到输入的字符 printf("输入的字符是:%c ",ch); //输出字符 return 0; }


2.getche()
从标准输入设备(键盘)读入一个字符,并回显在显示器上.
例码:
# include <conio.h> # include <iostream.h> # include <stdio.h> int main() { char ch; printf("请输入一个字符:"); ch = getche(); //在输入字符的时候,屏幕上能看到输入的字符 printf(" 输入的字符是:%c ",ch); //输出字符 return 0; }


3.getchar()
从标准输入设备(键盘)读入一个字符,并回显在显示器上.不过只返回第一个字符给ch
例码:

# include <conio.h> # include <iostream.h> # include <stdio.h> int main() { char ch; printf("请输入字符:"); ch = getchar(); //输入字符的时候,屏幕上能看到输入的字符,可以是一串字符,不过只能返回第一个字符给ch printf(" 输入的字符是:%c ",ch); //输出第一个字符 return 0; }

 

你可能感兴趣的:(getch(),getche(),getchar()的区别)