我试图执行K&R的1.10,所以这是:

问题描述 投票:0回答:4
编译此代码 如果我使用

backspace

,它不会打印
\b
。为什么?以及我如何尝试在linux中获得

\b

backspace
一个人说我:
您的程序可能看不到那个backspace。默认情况下,终端缓冲区逐行。 stdin也是如此。好吧,stdin的缓冲是IDB。
	
通常,控制台解释了特殊字符,例如backspace

ctrl-d

。您可以指示控制台不要使用

stty

在运行程序之前,您可以将TTY设置为忽略backspace模式的tty
c linux konsole
4个回答
2
投票

之后用恢复控制台 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

2
投票
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; }

1
投票
在屏幕上。这是为什么?由于TTY驱动程序还具有设置“ Echo Echoctl”,因此它们意味着,如果TTY驱动程序从终端获得SMTH,则必须回答终端,但是它不会响应其获得的相同的字节代码。由于0x08不是通常可打印符号的字节代码。它是控制符号的字节代码。它将用两个完全不同的符号回答

^H

0
投票
终端将它们拿到并在屏幕上打印。 关键是“^H”不是由我们的程序发送的,它是由TTY驱动程序发送的。

惠佛(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。它将其传递到终端。它打印''

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.