我想编写一个简单的功能,使我可以通过按任意键来停止控制台程序,而整个程序都在“后台”工作。
决定使用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')
。
我知道我可以声明每个键,并以此方式使它起作用,但是我确定有更好的方法可以这样做。谢谢
答案 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;
}
}