c - 按 home 或 end 时从 getchar 获取大写字母 O

标签 c linux getchar

我在我的 C 代码中使用它:

system("stty -echo -icanon");

这是家庭作业的一部分,但我正在做的这一部分超出了作业的要求。

我们正在实现一个 shell,我们已经得到了一堆代码可以开始使用。该代码不使用 ncurses(如果可以的话我会使用它)并且更改它需要重写大量提供的代码。

当我按下 HOMEEND 键时,我得到一个大写字母 O(即 Open 中的 o),然后是 HOMEEND 键。我正在使用 getchar() 来获取字符。

似乎只有这两个键可以执行此操作,但我不确定。如果所提供的系统函数调用是唯一不同的东西,我不是 100%(我们还将 stdout 设置为非阻塞,但这无关紧要)。

我真的很困惑,我想实现 END 和 HOME 键,因为我经常使用它们。

如果这不是很多信息,我很抱歉。我对 system 的了解还不够,无法真正理解 -echo 和 -icanon 对 stty 的影响。我已经查看了手册页,但仍然无法弄明白。

编辑

从 Alex Brown 的回答中,我确认我正在获取转义字符。我有类似以下的东西(在错误的伪代码中):

while (TRUE) 
    ch = getchar()
    switch (ch)
        case HOME:
        case END:
            don't print anything...
            break

        default:
            printf(ch);
            break

所以它从转义序列中打印出 O,而不是 [(我有 0x48 用于 HOME0x46 用于 结束)。仍然对如何获得真正的键码感到困惑...

最佳答案

对于控制台应用程序,HomeEnd 等键通常作为转义序列传输。确切的顺序取决于您使用的终端程序及其配置方式。该信息传统上存储在 termcap/terminfo 中,ncurses 根据您的终端类型从那里查找它。

Gnome 终端发送:

  • ESC O H (0x1b 0x4f 0x48) Home
  • ESC O F (0x1b 0x4f 0x46) End.

KDE Konsole 和 xterm 发送:

  • ESC [ H (0x1b 0x5b 0x48) Home
  • ESC [ F (0x1b 0x5b 0x46) End.

如果您读取 ESC 字符后跟 [O,您将需要读取一个额外的字符以确定哪个键被按下。

关于c - 按 home 或 end 时从 getchar 获取大写字母 O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12190216/

相关文章:

c - 为什么 getchar() 函数在这里不起作用?

c - 使用 WM_NCHITTEST 时捕获鼠标左键时出现问题

c++ - 如何在 C++ 中优化我的查询?

c - 为什么 GCC 的 __attribute__((...)) 语法使用双括号?

c - gdb nexti 命令不显示源代码行

linux - 使用 puppet 模块 Camptocamp Bind 创建主 DNS 和从 DNS

linux - 从另一个脚本运行 bash 脚本并在第二个脚本运行时退出第一个脚本

linux - 了解内核消息 'nobody cared (try booting with the "irqpoll"option)'

C- getchar() 重新读取字符?

c - 在 C 语言中,为什么 (while .. getchar()) 不写入我的文件?