我正在为Linux考试练习C编程。当用户按下Ctrl + a(而不是Ctrl + c)时,我不知道如何退出程序。例如,循环某些内容直到用户按下Ctrl + a。有人能告诉我如何检查Ctrl + a输入吗?
注:我正在使用“gcc”,并通过“./a.out”运行输出。
谢谢大家提前!
注:我正在使用“gcc”,并通过“./a.out”运行输出。
谢谢大家提前!
getch()
的函数调用,它可以从键盘读取单个字符;这些可以满足您的需求。getch()
功能。这可能是您问题的最简单答案。您需要阅读关于curses的文档,并将头文件和库链接到您的程序中。系统对Ctrl-C有特殊的支持,它会被转化为一个信号。如果你想让你的程序在使用其他特定键组合时立即停止,那就会更难。
你需要检查程序的标准输入,并设置标准输入,使输入不缓冲(否则,直到用户按下“回车”键确认之前,你将看不到任何输入)。后者应该使用ioctl()
调用完成,但这种方法并不可移植;
你需要使用线程或轮询,但在C语言中,这两种方法都不太可取。
在C语言中还有更有趣的东西可以练习。
你是不是在寻找类似这样的东西??? 只要按下Ctrl+A和Enter,这个程序就不会停止。
#include <stdio.h>
int main() {
char a;
while( a!=1 ) //Ascii code for ctrl + A == 1
{
a=getchar();
printf("still looping ...\n");
}
printf( "HA! You pressed CTRL+A\n" );
return 0;
}
但是如果你想在按下ctrl+A后立即终止程序(而不需要再按回车键),请看这里:
#include <stdio.h>
#include <ncurses.h>
int main() {
char a;
initscr();
raw();
while( a!=1 )
a=getch();
endwin();
return 0;
}
如果要使用GCC编译第二段代码,请尝试使用以下命令:
gcc -o program.o -lncurses program.cpp
stty intr ^a
./a.out
为了额外的学分,使用适当的库函数(例如“man termios”)执行“stty intr ^a”的等效操作。
有人发布了以下代码,它对我有效,但我不知道为什么他删除了他的答案。
原始链接:http://www.c.happycodings.com/Gnu-Linux/code18.html
#include <stdio.h>
#include <unistd.h> /* sleep(1) */
#include <signal.h>
void ex_program(int sig);
int main(void) {
(void) signal(SIGINT, ex_program);
while(1)
printf("sleeping .. ZZZzzzz ....\n"), sleep(1);
return 0;
}
void ex_program(int sig) {
printf("Wake up call ... !!! - Catched signal: %d ... !!\n", sig);
(void) signal(SIGINT, SIG_DFL);
}
这是如何将CTRL-A设置为中断以中止进程。请注意,在调用tcsetattr之后,CTRL-C无法中断它。
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
int main(int argc, char* argv[]) {
struct termios termios;
if ( tcgetattr(0, &termios) != -1 ) {
termios.c_cc[VINTR] = '\x01'; /* CTRL-A */
if ( tcsetattr(0, 0, &termios) != -1 ) {
printf("Ready. Press CTRL-A to break this program\n");
while ( 1 ) {
printf("*\n");
sleep(1);
}
}
}
}