C语言 getchar()的怪异行为



目前,我正在做一个项目在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

最新更新