我有一个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值,这是什么原因造成的?有任何想法吗?干杯!
答案 0 :(得分:6)
这可以按预期工作。通过VT100系列的终端仿真,例如向上移动的按键将以下序列发送到您的应用程序:
<ESC>[A
现在,ESC(0x1b)被剥离,因为它超出了你的有效范围。但其他角色完全有效。
因此,要删除这些,您的程序必须识别终端转义码;一个简单的规则是从转义中删除所有字符到下一个字母。这不会捕获所有终端转义序列,但最常见的是它会发生。
答案 1 :(得分:0)
发布的代码不包含某些关键信息。
要使此功能正常工作,代码需要修改与终端通信的“模式”。
正常的'模式'是'熟的',其中击键被回显到终端,并且像'退格'这样的击键由终端驱动程序处理。
要启用所需的功能,'mode'必须为'raw'且'echo'必须关闭。