0

我正在尝试执行 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 如果我用它编译这段代码,\b如果我使用Backspace. 为什么?以及如何尝试在 Linux中获得\b压力?Backspace

一个男生跟我说:

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

4

3 回答 3

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。享受

于 2014-05-30T16:07:57.817 回答
2

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

在运行程序之前,您可以将 tty 设置为忽略退格模式

stty erase ''

然后恢复控制台

stty sane

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


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

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

/* ... */
else if (c == '\b' || c == 127)
    printf("\\b");
于 2014-05-30T16:09:56.727 回答
1

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

于 2014-05-30T16:04:52.053 回答