我想用C语言做一个复杂的CLI应用程序,我只是想问Vim或Mutt如何有一个系统来检测按键.我怎样才能用Enter键输入,而不必因为换行符而再次写入整个屏幕.
我试过使用fgets
或getchar
,但我不想按Enter键来执行某些功能.
我不想使用像Conio这样的库.
我想用C语言做一个复杂的CLI应用程序,我只是想问Vim或Mutt如何有一个系统来检测按键.我怎样才能用Enter键输入,而不必因为换行符而再次写入整个屏幕.
我试过使用fgets
或getchar
,但我不想按Enter键来执行某些功能.
我不想使用像Conio这样的库.
虽然理想的解决方案是使用像curses
或ncurses
这样的库,但从理论上讲,您可以通过操作终端实现在没有库的情况下做到这一点.对于定位光标之类的事情,每个终端实现都会有一些不同的转义函数.
虽然它们中的许多都会在某种程度上遵循ANSI转义代码,但您会发现在这方面有很多变化,您的程序将不得不根据您的TERM
变量(在POSIX系统上)或某种其他类型的指示(我不知道Windows/DOS)来实现每一个变量
例如,定位游标的ANSI代码将是CSI n;m H[1].因此,要在第25列和第25行打印内容,您的代码将如下所示:
#include <stdio.h>
int main(int argc, char **argv, char **envp)
{
char chr;
printf("\033[25;25H");
scanf("%c", &chr);
printf("%c\n", chr);
return 0;
}
它将光标定位在第25行的第25列,并通过启用终端的回声,用户输入的任何内容都将出现在该行中.它还会打印您插入的键并换行.它可以在我的xTerm-256彩色终端上运行,也可能在最常用的Linux终端上运行.
不过,它可能在许多终端上都不起作用.
出于这个原因,我想让你的代码以可移植的方式工作将是一场噩梦--我所说的可移植是指在同一操作系统上甚至跨不同的终端,所以使用像ncurses
这样的库来抽象所有的转义对你来说将是一种不那么痛苦的编码方式.
参考文献
[1]ANSI逃逸代码:https://en.wikipedia.org/wiki/ANSI_escape_code#In_C