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

标签 c string user-input stdin ansi

我有一个 C 程序,它通过一段代码在 while 循环中(直到按下回车键)从标准输入中读取一些代码来询问用户的姓名。 我确保用户只能输入 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 值,那么这是什么原因呢?有任何想法吗?干杯!

最佳答案

这按预期工作。使用 VT100 系列的终端仿真,按下光标向上键会向您的应用程序发送以下序列:

<ESC>[A

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

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

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

关于c - 防止 C 键盘输入中的 ANSI 转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44298727/

相关文章:

c - Linux C 中的 Serial read() 问题

r - 在单词的字母之间插入空格

dialog - 在 Windows 8 中的 C#/MonoGame 应用程序中输入文本

string - 为什么从标准输入读取用户输入时我的字符串不匹配?

java - 获取学生评分测试成绩的平均值

python - python语言开发中的.c文件

c - 在 Linux 终端中打开用户指定的文件名

c - 如何使用 OpenMP 制作生产者-消费者代码?

javascript - 正则表达式匹配标点空格但保留标点符号

java - 我怎样才能获得以前的值java?