Предложите пользователю нажать Enter для продолжения - PullRequest
1 голос
/ 04 февраля 2020

У меня проблемы с тем, чтобы заставить мою программу принять нажатие клавиши ввода для продолжения ... Я пробовал getchar () двумя способами (в качестве условия, пока l oop и просто вызываю подпрограмму), но один не делает паузу программа и ожидание ввода, она просто проходит через все это и другие паузы, но не позволяет мне вводить что-либо или продолжать, когда я нажимаю ввод ...

void RestOfGame(int r, int c, int mG, int **cGen,int **nGen) {
  int i = 0, q = 0;
  for (i = 2; i <= mG; i++) {
    printf("\n(press enter to continue)\n\n");
    getchar();
    printf("Generation %d:\n", i);
    ExamineReplace(r, c, cGen, nGen);
    NewToOld(r, c, cGen, nGen);
    DrawGrid(r, c, cGen);
  }
}

Я прочитал в нескольких других темах о том, что ранее отсканировал что-то и буфер, сохраняющий \ n ... пробовал некоторые варианты, но я не думаю, что сделал все правильно.

Работа на платформе windows, язык C. Любые предложения?

ОБНОВЛЕНИЕ: Я мог бы добавить, что этот код запускается с файлом данных в качестве ввода при перенаправлении в командной строке. Может перепутать мой getchar (), хотя я прочитал весь файл?

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

Использование функции GetAsyncKeyState () из заголовочного файла Windows .h позволяет нам проверить, была ли нажата или нажата клавиша.

Так что создайте al oop, который проверяет клавишу состояние, пока он не обнаружит, что он был нажат. что я сделал в функции wait_key ()

#include <stdio.h>
#include <stdlib.h>

#include <Windows.h>

#define UNUSED(x)((void)(x))

// Function that waits for key press
static inline void wait_key(const int vKey, const char* const phrase) {
    // Display user message
    puts(phrase);

    // Wait until key is pressed
    while (!GetAsyncKeyState(vKey))
        Sleep(100);
}

int main(const int argc, const char** argv) {
    UNUSED(argc); UNUSED(argv);

    // VK_RETURN = enter key : https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
    // Wait until enter key is pressed
    wait_key(VK_RETURN, "Press enter to continue...");

    return (int)EXIT_SUCCESS;
}
0 голосов
/ 04 февраля 2020

Если вы просто хотите подождать и попросить пользователя нажать , чтобы продолжить, введите , затем используйте fgets() и короткий буфер. fgets() будет блокироваться до получения ввода и будет считывать и включать '\n' (генерируется нажатием Enter ) в заполняемый буфер.

Вы должны помнить о состоянии stdin, прежде чем позвонить fgets() (например, если при предыдущем чтении с scanf и "%d" оставлено '\n' в stdin непрочитанным, то будет казаться, что fgets() был пропущен)

Ваша функция выше и будет переписана следующим образом, чтобы ждать, пока пользователь не нажмет Enter

void RestOfGame (int r, int c, int mG, int **cGen,int **nGen)
{
    int i = 0, q = 0;

    for (i = 2; i <= mG; i++) {
        char buf[128];                                    /* short buffer for fgets */
        printf("\n(press enter to continue)\n\n");
        fgets (buf, sizeof buf, stdin);                   /* fgets for input */
        printf("Generation %d:\n", i);
        ExamineReplace(r, c, cGen, nGen);
        NewToOld(r, c, cGen, nGen);
        DrawGrid(r, c, cGen);
    }
}

выше, buf является коротким 128-символьным буфером, который будет обрабатывать Enter , а также 126 других нажатий пальца до Введите и продолжат нормально работать.

...