getch(),getchar(),getche()函数

    1.关于getch() getchar() getche()

   

    getch():

    所在头文件:conio.h

    函数用途:从控制台读取一个字符,但不显示在屏幕上
    函数原型:int getch(void)
    返回值:读取的字符

    例如:
    char ch;或int ch;
    getch();或ch=getch();

    用getch();会等待你按下任意键,再继续执行下面的语句;

    用ch=getch();会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch,再执行下面的语句。
    易错点:所在头文件是conio.h。而不是stdio.h。
    getch();并非标准C中的函数,不存在C语言中。所以在使用的时候要注意程序的可移植性。国内C语言新手常常使用getch();来暂停程序且不知道此函数来源,建议使用getchar();(如果情况允许)代替此功能或更换一款编译器。

   

    函数名: getche
    功 能: 输入后立即从控制台取字符,不以回车为结束(带回显)
    用 法: int getche(void);
    程序例:
    #include <stdio.h>
    #include <conio.h>
    int main(void)
   {
    char ch;
    printf("Input a character:");
    ch = getche();
    printf("\nYou input a '%c'\n", ch);
    return 0;
   }

   

    函数名:getchar

    而对于getchar,我们知道getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

  getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回, getch返回值是用户输入的ASCII码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.

  这个版本忽略了个重点,getch()是非缓冲输入函数,就是不能用getch()来接受缓冲区已存在的字符,如以下C++程序,

  int i;while(cin>>i);cin.clear();getchar();运行时如果输入1 2 3 a时必须用getchar()才能在后面程序获得正常输入,即使先前已经恢复流了,此处用getch()是万万不行的。---这一段从百度词条看到,不是很明白c++中字符串输入规则
先看看规范点的说法:

 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调用不会等待用户按键,而直接读取缓冲区中的字符,直到读完规定的次数后(并不是读完缓冲区的字符),才等待用户按键。

     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次后遇回车才结束,

    细心的朋友会发现,调用getchar()时真正输入的字符只有19个,因为系统默认把第一个字符设为‘\0’.

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

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

\r 是回车,return,意思就是“回到行首”

\n 是换行,newline,意思就是“另起一行”

我们在平时使用电脑时,已经习惯了回车和换行一次搞定,敲一个回车键,即是回车,又是换行,但在早期的打字机上,要另起一行打字需要两个步骤,首先要发送命令"\r”将打字头复位,即回车;然后再发送命令"\n”让打字机走纸移到下一行。

getch()不是ANSI里的标准库函数,这是历史遗留问题,按照上述步骤,是先发送"\t",所以getch获取的enter键值是\r。

getchar()是标准库函数,既“敲一个回车键,即是回车,又是换行”,而现在的“\n“表示既回车又换行的意思。

看看下面的函数:

#include<stdio.h>
main()
{
 FILE *fp;
 char ch,filename[10]="xw.c";
 //scanf("%s",filename);
 if((fp=fopen(filename,"a"))==NULL)
 {printf("connot open file\n");
 //exit(0);
 }
 //ch=getchar();
 ch=getchar();
 printf("ch is :%c\n",ch);
 while(ch!='#')
 {
  fputc(ch,fp);
  putchar(ch);
  ch=getchar();
 }
 fclose(fp);
}

我们运行程序,输入:the string is xiongwei;回车;可以看到输出:

ch is :t

the string is xiongwei;  此时这个字符串并没有追加到xw.c中.

只有当输入'#'时,程序才结束,打开xw.c文件可以看到字符串已经追加到文件中.

   第一次按回车时,ch 从键盘缓冲区读取一个字母,并且打印出来,说明循环体之外的getchar()函数已经读取完毕,既其结束条件已经满足;而下面的循环体需要遇到’#’才算结束条件,所以下面输入的所有字符,全都送入键盘缓冲区,直到遇到’#’才结束输入(输入次数已到),开始读取缓冲区中的内容.而需要注意的是:putchar()函数,其不管遇到结束符与否,只要有回车,就会把相应的缓冲区中的内容打印出来

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值