【发布时间】:2017-11-02 01:58:36
【问题描述】:
我有一个 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 值,那么这是什么原因呢?有任何想法吗?干杯!
【问题讨论】:
-
提供一个MCVE stackoverflow.com/help/mcve
-
@CIsForCookies 谢谢!我添加了适当的片段,但我正在为一个在串行 com 端口上侦听的终端进行编码,因此对于常规标准输出,代码有点不同。
-
如果是作业,不要管用户终端。如果你想为生产程序提供更好的用户体验,请使用 GNU readline 或类似的库而不是 stdio。
-
在其他新闻中,不要使用像 126、8 或 32 这样的幻数。C 有字符文字,请改用这些。
-
别担心,作业不会标记代码质量。只查看实现的功能。看,我们正在 AVR 微控制器和 LED 矩阵上制作蛇游戏。在用户终端之间来回发送信息对于显示其他信息很有用。
标签: c string user-input stdin ansi