getchar()和getch()区别

很多时候我们都需要从用户的键盘上获取一些字符,比如搞一些小游戏,搞一个用户选择啦。
例如
switch(a=getchar())
{
case:
.............
break;
default:
break;
}
通常大家都会选择getchar()来获取一个输入,但可能大家会有很多问题
Q1,像一些ESC,上箭头,功能键这样的键没法输入
     例如:
             if(getchar()==27)       //27是ESC键的键值
            {
            printf("已获取esc键");
            }
        大家会发现,我擦,为什么我按了esc和enter键却还是什么都不输出,编译器坏了?
         通过观察内存发现,获取的键值竟然是10,那么10是个什么东东,一查发现是'\n'的键值
         那么就是说只读到了enter键!!!!!!!!!
Q2,有时候大家会遇到这种情况,有两重选择
       例如:switch(a==getchar())
                    { 
                        case  :
                        switch(b==getchar());
                        {        
                            ...............
                           }
                          break;
                         default:
                          break:
                    }
                结果会发现第二个getchar()获取的字符要经过两便输入才能读取,这个大家就会觉得莫名其妙!!!!!
这是怎么回事,闹鬼了???,当然不,问题就出现在对getchar()函数的理解上
getch()函数通常需要一个enter键来确定输入,当收到enter键之后才回把屏幕上所能占位置的字符输入到缓冲区(注意
占位置的含义就是会使屏幕光标后移,例如字母,空格等,但esc并不会使光标后移所以他不能被接收),并只读取第一
个字符,其他还留在缓冲区。现在来说说上面上面两个问题
A1:由于esc不能使光标挪动,但是enter却可以,结果getchar()就把enter送到了缓冲区接收了。
A2:第一个getchar读到了例如是a和enter,进入第二重后还有enter在缓冲区,再输入h和enter,先把前一个enter读掉,现在缓冲区剩
     h和enter,这时候,你第三次输入enter才能把h字符送去匹配。。。。。。
     解决方法S1:每次写两个getchar,第一个接收字符,第二个读掉enter
                   S2:用fllush("stdin");清除缓冲区。
########################################################
下来说说getch()
首先使用它得调用#include<conio.h>
他的作用是读取无回显一个字符,用它接收函数并不用按下enter键,所以一般的键值检测也常用它,
无回显是什么意思呢,就是用它接收字符不会在屏幕上显示该字符,而getchar()会显示,许多人也好奇
输密码会显示********,怎么弄得,这个函数大家可以试一下,做做小课设时装逼也行。(给段代码^-^)
#include<stdio.h>
#include<conio.h>

int main(void)
{
    int n=0;
    char ch[10] = {0};
    for (int i = 0; i < 10;i++) //输入一个字符保存起来输出个*
    {
        ch[i] = _getch();
        if (ch[i] == '\r')
        {
            break;
        }
        printf("*");
        n++;
    }
    printf("\n");
    for (int i = 0; i < n; i++)//把真正的密码打印一下
    {
        printf("%c", ch[i]);
    }
    _getch();
    return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值