Остановка консольной программы нажатием любой клавиши в C - PullRequest
0 голосов
/ 06 января 2019

Я хочу написать простую функцию, которая позволяет мне останавливать консольную программу нажатием любой клавиши, пока вся программа работает в «фоновом режиме»

Решил использовать termios.h, потому что у меня были некоторые проблемы с lncurses.h. Я закончил свою функцию, и она работает довольно хорошо, но у меня есть проблема, чтобы остановить ее, нажав любую клавишу.

int main()
{
  int key;
  for (;;) {
    key = getkey(); 

    if (key !='\0') {
      //also tried if (key != NULL) and if (key != 0x00)
      break;

    }else {

      //do some stuff in loop till any key is pressed       
    }
  }
  return 0;
}

Пока что я могу остановить программу, нажав любую ранее объявленную клавишу, например

if (key =='q' || key =='w').

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

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Функция kbhit () в conio.h может выполнять эту работу.

Давайте приведем пример.

Следующий код печатает натуральные числа без остановки и контроля над ним

#include<stdio.h>
int main(){
    for (int k=1;;k++){
        printf("%d\n",k);
    }
}

Теперь, если мы добавим if(kbhit())break; внутри цикла, это сделает работу за нас

#include<conio.h>
#include<stdio.h>
int main(){
    for (int k=1;;k++){
        printf("%d\n",k);
        if(kbhit())break;
    }
}
0 голосов
/ 06 января 2019

Символьные данные представлены в компьютере с использованием стандартизированных числовые коды, которые были разработаны. Наиболее широко принятый код называется американский стандартный код для обмена информацией ( ASCII). Код ASCII связывает целочисленное значение для каждого символа в набор символов, например буквы, цифры, знаки пунктуации, специальные символы и управляющие символы.

Вы можете проверить, что межсимвольный символ находится между 'a' и 'z':

if ((key >= 'a' && key <= 'z') || (key >= 'A' && key <= 'Z')){
   //stop 
}

можете использовать этот код:

#include <termios.h>
#include <stdlib.h>

void RestoreKeyboardBlocking(struct termios *initial_settings)
{
    tcsetattr(0, TCSANOW, initial_settings);
}

void SetKeyboardNonBlock(struct termios *initial_settings)
{

    struct termios new_settings;
    tcgetattr(0,initial_settings);

    new_settings = initial_settings;
    new_settings.c_lflag &= ~ICANON;
    new_settings.c_lflag &= ~ECHO;
    new_settings.c_lflag &= ~ISIG;
    new_settings.c_cc[VMIN] = 0;
    new_settings.c_cc[VTIME] = 0;

    tcsetattr(0, TCSANOW, &new_settings);
}

int main()
{
    struct termios term_settings;
    char c = 0;

    SetKeyboardNonBlock(&term_settings);

    while(1)
    {
        c = getchar();
        if(c > 0){
            //printf("Read: %c\n", c);
            //do some stuff in loop till any key is pressed       
        }

    //Not restoring the keyboard settings causes the input from the terminal to not work right
    RestoreKeyboardBlocking(&term_settings);

    return 0;
}
...