我想用C语言做一个复杂的CLI应用程序,我只是想问Vim或Mutt如何有一个系统来检测按键.我怎样才能用Enter键输入,而不必因为换行符而再次写入整个屏幕.

我试过使用fgetsgetchar,但我不想按Enter键来执行某些功能. 我不想使用像Conio这样的库.

推荐答案

虽然理想的解决方案是使用像cursesncurses这样的库,但从理论上讲,您可以通过操作终端实现在没有库的情况下做到这一点.对于定位光标之类的事情,每个终端实现都会有一些不同的转义函数.

虽然它们中的许多都会在某种程度上遵循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

C++相关问答推荐

rSP堆栈指针在返回函数调用的值时有任何用途吗?

位屏蔽对于无符号转换是强制的吗?

gcc已编译的可执行文件TSB是否同时暗示最低有效字节和最低有效位?

使用额外的公共参数自定义printf

Can函数指针指向C++中具有不同参数连续性的函数

如何在C中打印包含扫描字符和整数的语句?

S在本文中的价值观到底出了什么问题?

将数组插入数组

如何确保我将使用C标准库函数的函数版本,如&getc";,而不是类似函数的宏版本?

链表删除 node 错误

Fprintf正在写入多个 struct 成员,并且数据过剩

从BIOS(8086)中读取刻度需要多少?

使用正则表达式获取字符串中标记的开始和结束

为什么会出现此错误?二进制表达式的操作数无效

如何在MSVC中使用intSafe.h函数?

在Ubuntu上使用库部署C程序的最佳实践

为什么一个在线编译器拒绝这个VLA代码,而本地的Apple clang却不拒绝;t?

C/C++编译器可以在编译过程中通过按引用传递来优化按值传递吗?

为什么 C 字符串并不总是等同于字符数组?

将帧从相机 (/dev/video0) 复制到帧缓冲区 (/dev/fb0) 会产生意外结果