通过按C中的任意键来停止控制台程序

时间:2019-01-06 17:31:38

标签: c linux termios

我想编写一个简单的功能,使我可以通过按任意键来停止控制台程序,而整个程序都在“后台”工作。

决定使用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 :(得分:1)

  

通过使用标准化方法在计算机中表示字符数据   已开发的数字代码。最广泛接受的代码   被称为美国信息交换标准代码(   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;
}

答案 1 :(得分:0)

conio.h 中的 kbhit()函数可以完成这项工作。

让我们举个例子。

以下代码可打印自然数,而无需停止或控制它

#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;
    }
}