Getch () не работает должным образом в последней версии Microsoft Visual Studio 2017 C

Я провел последние пару недель, работая над приложением, которое в основном полагается на функцию getch (), затем я недавно решил обновить визуальную студию только для того, чтобы узнать, что моя программа полностью сломана и больше не работает.

Вот простой пример того, что у меня есть:

main(){
while (1){
 //The program loops until 's' is pressed (this still works)
 com=getch();
  if (com=='s'){
   //The program used to stop here and wait for input (now it doesn't)
   com=getch();
   if (com=='d') printf("Victory!\n");
   else break;
  }
}
} 

* Это не часть моей программы, это просто пример, который требует нажатия 's', затем 'd', чтобы выиграть

Это работало до того, как я обновился, я знаю, потому что я потратил более 50 часов на работу над программой, и она работала следующим образом:

Программа достигнет getch () и будет ждать моего ввода, если я нажму 's', if вызовет выполнение своей функции, а затем достигнет второго getch () и будет ждать моего ввода, поэтому вы должны нажать 'd 'и выигрывай!

Суть в том, что раньше он ждал моего ввода при каждом getch ()!

Но теперь, новое обновление, он ждет первого getch (), но compitley игнорирует второе, что хорошо завершает программу, и нет никакого способа выиграть.

Может, я что-то сделал, может, getch () теперь незаконен, я не знаю, я недоволен, я не знаю, что делать ...

В любом случае заранее спасибо, если вам еще что-то нужно знать, не стесняйтесь спрашивать. Я новичок в программировании, поэтому не ожидайте ответов на высоком уровне!

Редактировать: Я потратил еще несколько часов на изучение кода:

#include <conio.h>
#include <stdio.h>
main(){
    char com;
    while(1){
        com=getch();
        printf("You pressed: %c\n",com);
    }
}

 Here are the results:
 You pressed: d 
 You pressed: 
 You pressed: s 
 You pressed: 
 You pressed: a 
 You pressed:

Входными данными были «d», «s» и «a».

Я полагаю, лучшего решения нет ... Спасибо за помощь

Antonio Klasić 16.09.2018 22:31

Попробуйте printf("You pressed %c (%d)\n", com, com);

pmg 16.09.2018 22:32

Неявный int больше не является частью языка C.

n. 1.8e9-where's-my-share m. 11.12.2018 10:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
1 476
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это ошибка Windows. Согласно эта ветка, системная DLL ucrtbase.dll версии 17134 внесла ошибку. Эта DLL распространяется как VS2017, так и Windows 10 build 1803.

Они обещали исправить это, но пока нет исправления. Эта ошибка нарушила поведение многих скомпилированных приложений, использующих _getch().


Чтобы обойти проблему, вы можете:

  • измените свой код, чтобы отказаться от дополнительных возвратов (они имеют значение 0).
  • Вместо этого используйте _getwch().
  • Вместо этого используйте функцию Windows API ReadConsole (пример кода см. В связанной ветке).

Другие вопросы по теме