退格无法在Linux终端中检测到,K& R 1.10可以运行

时间:2014-05-30 15:55:20

标签: c linux konsole

我试图执行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中尝试\b Backspace

一个人说过我:

  

您的程序可能看不到退格。默认情况下,终端按行缓冲。 stdin也是如此。好吧,stdin的缓冲是IDB。

3 个答案:

答案 0 :(得分: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然后使用它获取退格的ASCII,无需输入或清理输入缓冲区并返回一个int。 享受

答案 1 :(得分:2)

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

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

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

然后使用

恢复控制台
stty sane

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


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

在这种情况下,您可以启动程序并在任何使用退格键的位置键入 Ctrl-h 。如果您想要捕获退格键,还必须检查DELASCII 127

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

答案 2 :(得分:1)

您的代码无法运行,因为它的目的是在非常旧的UNIX计算机上运行。在现代终端上,退格角色不会被考虑。