getch () не работает должным образом в последней версии Microsoft Visual Studio 2017 C - PullRequest
0 голосов
/ 16 сентября 2018

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

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

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 (), но complitley игнорирует второе, что хорошо завершает программу, и выиграть невозможно.

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

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

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

#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'.

1 Ответ

0 голосов
/ 17 сентября 2018

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

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


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

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