Почему иначе, если результаты получаются другими по сравнению с переключателем?

#c

Вопрос:

У меня есть простой фрагмент кода, который обнаруживает нажатия клавиш с помощью ncurses .

Как я понимаю, 1 нажатие клавиши помещает 3 значения в буфер. Где 3-е значение различается, например, между клавишами со стрелками.

Поэтому при нажатии любой из 4 стрелок на клавиатуре первые 2 значения, помещенные в буфер , должны быть одинаковыми 33 , и [ . Но 3-е значение уникально для стрелки ( A для вверх, B для вниз, C для вправо или D влево). Поэтому при сопоставлении действий с нажатиями клавиш мы зависим от 3-го значения.

При попытке оценить, какая стрелка была нажата, я попробовал как if else лестницу, так и a switch . if else Лестница работает идеально. Но переключатель, похоже, срабатывает в нескольких случаях при каждом нажатии клавиши.

Вот рабочий код (если еще) —

 char first = getch(); //returns 33 char second = getch(); //returns [ char third = getch(); // returns A or B or C or D  if(third == 'A'){ printf("Up Arrow Pressed"); } else if(third == 'B'){ printf("Down Arrow Pressed"); } else if(third == 'C'){ printf("Right Arrow Pressed"); } else if(third == 'D'){ printf("Left Arrow Pressed"); }  

Вот код, который не работает (Случай) —

 char first = getch(); //returns 33 char second = getch(); //returns [ char third = getch(); // returns A or B or C or D   switch(third){  case('B'):  printf("nDOWN");  case('C'):  printf("nRIGHT");  case('A'):  printf("nUP");  case('D'):  printf("nLEFT");  default:  printf("default");  }  

Это вывод, когда используются случаи, и я нажимаю клавишу вниз:

введите описание изображения здесь

Комментарии:

1. if(third == "A") так и должно быть if(third == 'A') . То же самое касается и других условий.

2. Вы забыли break; заявление в конце каждого дела в коммутаторе.

3. @kaylum: Кроме того, если это не просто опечатка, Third то должна быть пара s third .

Ответ №1:

если вы этого не break; сделаете в конце дела, будет выполнено следующее дело.

Ответ №2:

Если вы не используете break в конце каждого случая, то случаи, которые вы пишете после истинного случая, также будут выполнены.

Ответ №3:

Используйте «break;» (так же, как в коде, представленном в виде изображения) в качестве последнего оператора в каждом случае, чтобы предотвратить выполнение последующих случаев.! (https://i.stack.imgur.com/up2pG.png)

Комментарии:

1. Пожалуйста, отправьте свой код непосредственно на вопрос, не нужно добавлять дополнительные URL-адреса, которые могут стать недействительными в будущем.