K& R 1-10,终端吃掉退格

时间:2013-01-08 01:03:43

标签: c

K& R C 1-10读取:

“编写程序将其输入复制到其输出,用\ t替换每个选项卡,用\ b替换每个退格键,用\替换每个反斜杠。这使得选项卡和退格以明确的方式显示。”

我有以下代码,它不适用于退格字符,因为终端吃掉了字符。到目前为止,似乎没有一本解决方案与书中涵盖的材料有关。解决方案是什么?

#include <stdio.h>

main()
{
    int c;

    while((c = getchar()) != EOF) {

        switch (c) {
            case '\t':
                printf("\\t");
                break;
            case '\b':
                printf("\\b");
                break;
            case '\\':
                printf("\\\\");
                break;
            default:
                putchar(c);
        }
    }
}

2 个答案:

答案 0 :(得分:4)

这里没有错。如果您要在包含退格符的文件上运行此程序,它将正确转换它。对于终端输入,程序将不会接收退格,因为它由输入例程管理。

答案 1 :(得分:3)

这是因为操作系统正在处理终端IO,并在程序看到之前处理键盘上的字符。

如果你在Unix / Linux系统上,你可以像这样包装程序的执行:

$ stty -icanon -echo; ./a.out; stty icanon echo

这将禁止终端驱动程序以某些特定方式处理输入:icanon可以处理退格处理等事务,而echo则会打印您键入的字符。由于您的程序会回显字符本身,因此您可以关闭回声。唯一的问题是-icanon也会停止EOF处理,所以你需要添加一个额外的条件才能离开循环:

#include <stdio.h>

#define CTRL(x) (x & 0x1f)

main()
{
    int c;

    while((c = getchar()) != EOF && c != CTRL('d')) {
...

在测试这样的程序时,在单独的窗口中运行它们也是一个好主意,因此如果您最终处于一种奇怪的终端模式,您可以快速轻松地终止整个会话!