backspace
,它不会打印\b
。为什么?以及我如何尝试在linux中获得\b
backspace?
一个人说我:您的程序可能看不到那个backspace。默认情况下,终端缓冲区逐行。 stdin也是如此。好吧,stdin的缓冲是IDB。
通常,控制台解释了特殊字符,例如backspace或ctrl-d
。您可以指示控制台不要使用
stty
。
在运行程序之前,您可以将TTY设置为忽略backspace模式的tty
之后用恢复控制台
stty sane
this this this backspace字符ctrl-h未更改为您正在运行的程序。
如果这没有任何差异,则可以将backspace键映射到del而不是
ctrl-h
.。在这种情况下,您只需启动程序,然后在任何地方使用BackSpace键即可键入
Ctrl-H
。但是,如果您想捕获Backspace键,则还必须检查DEL
127
/* ... */
else if (c == '\b' || c == 127)
printf("\\b");
使用getch,然后使用它来获得ASCII进行后垫,无需Enter或清洁输入缓冲区,并且返回INT。 享受 您的代码不起作用,因为它打算在非常旧的Unix机器上运行。在现代终端上,不考虑backspace角色。
对于谁感兴趣的人: 我们的C程序是A.Out suppose我们使用Linux控制台端子TTY2
在这里是简化的架构a.out------ TTY驱动程序------终端(键盘,显示)当我们启动A时。在启动新二进制之前,请更改TTY驱动程序的设置,例如:
#stty -file =/dev/tty2-a
icicanon回声echoctl ...
我们的proram不会改变这一点。我们有什么?当我们在键盘上键入BackSpace键时 - 终端将字节代码0x08发送到TTY驱动程序。 它具有设置“ ICANON”,首先是TTY驱动程序以规范模式工作。这意味着ID不会传递其在缓冲区中获得的任何内容,直到从终端键盘获得“马车返回”字节代码为止(即用户命中键输入键)。 这意味着当您按Backspace时,您的程序不会得到任何东西。 同时,当您这样做时,您会看到
#include <termios.h>
#include <unistd.h>
int mygetch(void)
{
struct termios oldt,
newt;
int ch;
tcgetattr( STDIN_FILENO, &oldt );
newt = oldt;
newt.c_lflag &= ~( ICANON | ECHO );
tcsetattr( STDIN_FILENO, TCSANOW, &newt );
ch = getchar();
tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
return ch;
}
^H
惠佛(Howerver)正如我所说的,C计划仍然什么都没有。但是,如果您点击Enter-最终将获得Backspace字节代码,并且它将“将”发送给STDOUT,它将到达TTY驱动程序并将其传递给终端,并将其打印。
所以再过一次,您可以通过Bash启动该程序,Bash更改TTY驱动程序设置,您击中了Backspace,tty驱动程序与“^H”符号一起回答,tty驱动程序回答了tty驱动程序,但tty驱动程序将其传递给终端,终端将它们打印回终端。如果您不点击Enter,那么什么也不会发生。如果您点击Enter然后 Enter Byte代码到达TTY驱动程序,它将通过Backspace+Enter将其传递给A.Out
a。它将其传递到终端。它打印''