目前,我正在做一个项目在c语言中,我必须写一个while循环恒定接收键盘输入或操纵杆输入。操纵杆输入是可以的,但键盘输入有两种类型:箭头和普通输入("a"、"b"等)。对于键盘输入,我参考了这个链接(https://stackoverflow.com/a/11432632)来接收箭头键。下面是我的代码:
while(true){
if (getchar() == ' 33') { // if the first value is esc
getchar(); // skip the [
switch(getchar()) { // the real value
case 'A':
printf("arrow up n");
break;
case 'B':
printf("arrow down n");
break;
case 'C':
printf("arrow right n");
break;
case 'D':
printf("arrow left n");
break;
}
}
if (getchar() != ' 33'){
printf("non arrow n");
}
}
然而,"非箭头">
如果我将printf("non arrow n")的代码更改为有一个变量char c,将getchar()赋值给它,然后打印c:
if (getchar() != ' 33'){
printf("non arrow n");
}
对于箭头键,输出将如预期的那样(接收和打印如预期的那样),但是当输入'e'或'r'或其他单字符键时,什么也没有出现。
我想知道我的代码有什么问题,我如何修改它来接收我想要的行为。
我希望尽快收到答复。
谢谢你,Huy Nguyen。
当你测试if (getchar() != ' 33')
时,你正在读取另一个字符,而不是测试你第一次测试的同一个字符。
使用else
代替再次调用getchar()
。
while(true){
if (getchar() == 'e') { // if the first value is esc
getchar(); // skip the [
switch(getchar()) { // the real value
case 'A':
printf("arrow up n");
break;
case 'B':
printf("arrow down n");
break;
case 'C':
printf("arrow right n");
break;
case 'D':
printf("arrow left n");
break;
default:
printf("non arrown");
}
} else {
printf("non arrow n");
}
}
我在switch
中添加了一个default:
case,以防它们发送不同的转义序列。您可能还应该检查ESC
之后的第一个字符是否为[
,而不是假设它将是。
如果你有两个以上的条件,你可以在那里使用switch(getchar())
,就像你在ESC [
后面的字符一样,或者你可以把getchar()
的结果赋值给一个变量,并在条件中测试它。
同样,当您测试互斥条件时,您应该使用else if
。