在按回家或结束时从getchar获得资金O.

时间:2012-08-30 05:05:38

标签: c linux getchar

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

system("stty -echo -icanon");

这是家庭作业的一部分,但这个特殊部分是我正在努力超出作业要求的。

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

当我按下 HOME END 键时,我得到一个大写字母O(就像在Open中一样,然后是 HOME END 键。我正在使用getchar()来获取角色。

似乎这些只是这两个键,但我不确定。如果提供的系统函数调用是唯一不同的(我们还将stdout设置为非阻塞,那么我不是100%,但这应该无关紧要。)

我真的很困惑,我想实现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,但不是[(我有{kbd> HOME 的0x48 END的<{1}} )。仍然难以获得如何获得真正的密码...

2 个答案:

答案 0 :(得分:3)

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

Gnome Terminal发送:

  • 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 ,则需要读取其他字符才能确定哪个键被压了。

答案 1 :(得分:1)

终端(以及您的应用程序)接收许多元字符(例如箭头键,功能键和home,end等)作为转义字符 - 转义码后跟一个或多个字节值。由于每个字节都是由单独的get char调用接收的,因此这可能就是您遇到的情况。我不知道你为什么把转义字符视为'O'。