在C中防止键盘输入中的ANSI转义字符

时间:2017-06-01 04:47:53

标签: c string user-input stdin ansi

我有一个C程序,要求用户输入一些代码,这些代码在while循环中从stdin读取(直到按下enter键)。 我确保用户只能输入32到126的ASCII值。

问题是当我按下我的箭头(光标)键,或者像PAGE_DOWN或其他类似的东西时...... 我最终将ANSI转义序列打印到终端([A,[6~等]。

以下是代码部分。

char name[6];
char c;
uint8_t i = 0;
while ((c = getchar()) != '\n') {
    if (c == 127 || c == 8) {   // Checks if backspace or del is pressed
        i--;
        name[i] = ' ';
    } else if (c >= 32 && c <= 126) {   // Only legal key presses please!
        name[i] = c;
        i++;
    } else {

    }

    if ((c >= 32 && c <= 126) || c == 127 || c == 8) {
        printf_P(PSTR("%c"), c);
    }
}
name[5] = '\0';
move_cursor(15, 18);
printf_P(PSTR("%s"), name);

我当然选择忽略32到126范围之外的ASCII值,这是什么原因造成的?有任何想法吗?干杯!

2 个答案:

答案 0 :(得分:6)

这可以按预期工作。通过VT100系列的终端仿真,例如向上移动的按键将以下序列发送到您的应用程序:

<ESC>[A

现在,ESC(0x1b)被剥离,因为它超出了你的有效范围。但其他角色完全有效。

因此,要删除这些,您的程序必须识别终端转义码;一个简单的规则是从转义中删除所有字符到下一个字母。这不会捕获所有终端转义序列,但最常见的是它会发生。

您可以在这里查看list of common terminal control escape sequences

答案 1 :(得分:0)

发布的代码不包含某些关键信息。

要使此功能正常工作,代码需要修改与终端通信的“模式”。

正常的'模式'是'熟的',其中击键被回显到终端,并且像'退格'这样的击键由终端驱动程序处理。

要启用所需的功能,'mode'必须为'raw'且'echo'必须关闭。