很多时候我们都需要从用户的键盘上获取一些字符,比如搞一些小游戏,搞一个用户选择啦。
例如
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;
}