【问题标题】:Backspace can't be detected in linux terminal , K&R 1.10 exercize在linux终端中无法检测到退格键,K&R 1.10 exercize
【发布时间】:2014-05-30 15:55:19
【问题描述】:

我正在尝试执行 k&r 的 execize 1.10,所以这是:

/* 
 * Exercise 1.10
 *
 * Write a program to copy its input to its output, replacing each tab 
 * by \t, each backspace by \b, and each backslash by \\. This makes tab 
 * and backspaces visible in an unambiguous way.
 *
 */
#include <stdio.h>

int main()
{
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t')
            printf("\\t");
        else if (c == '\b')
            printf("\\b");
        else if (c == '\\')
            printf("\\\\");
        else
            printf("%c", c);
    }
}

如果我用gcc -std=c99 1.10.c -o test 编译这段代码 如果我使用 Backspace,它不会打印 \b。为什么?以及如何尝试在 Linux 中按 Backspace 获得\b

有人说我:

您的程序可能看不到该退格键。默认情况下,终端按行缓冲。标准输入也是如此。嗯,stdin 的缓冲就是 IDB。

【问题讨论】:

  • 该练习旨在用于非常旧的 UNIX 机器。我认为从那时起终端的工作方式发生了变化。
  • 您可能需要在ansivt100 终端仿真上执行您的代码。

标签: c linux konsole


【解决方案1】:

通常,控制台会解释特殊字符,例如 backspaceCtrl-d。您可以使用stty 指示控制台不要执行此操作。

在运行程序之前,您可以使用

将 tty 设置为忽略退格模式
stty erase ''

然后使用

恢复控制台
stty sane

这会将退格字符 Ctrl-h 原封不动地传递给您正在运行的程序。


如果这没有显示任何区别,则退格键可能会映射到 DEL 而不是 Ctrl-h

在这种情况下,您只需启动您的程序并在您使用退格键的任何地方键入 Ctrl-h。尽管如此,如果你想抓住退格键,你还必须检查DEL,即ASCII 127

/* ... */
else if (c == '\b' || c == 127)
    printf("\\b");

【讨论】:

  • 即使在我运行我的程序之前输入你的代码,\b 也不会被打印出来。
  • 那么你的退格键不是Ctrl-h,而是DEL。请查看更新的答案。
【解决方案2】:
#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;
}

使用 getch 然后使用它获取用于 backsapce 的 ASCII,无需输入或清理输入缓冲区,它返回一个 int。 享受

【讨论】:

  • mm 对于 K&R 第 16 页上的内容来说要复杂得多??无论如何谢谢你,也许我会在一段时间后理解你的代码:)
【解决方案3】:

您的代码无法运行,因为它打算在非常旧的 UNIX 机器上运行。在现代终端上,不会考虑退格字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2017-11-23
    • 1970-01-01
    相关资源
    最近更新 更多