【问题标题】:K&R 1-10, the terminal eats the backspaceK&R 1-10,终端吃退格
【发布时间】:2017-01-30 08:39:43
【问题描述】:

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);
        }
    }
}

【问题讨论】:

  • 输入重定向到救援:yourprogram &lt; filecontainingabackspaceorataborboth :-)
  • 在现代类 Unix 系统上,您可以使用 control-V control-H(或 control-V 退格键)在终端输入退格键。 K&R 书没有详细介绍 Unix 环境的细节,无法提及这类问题——也不应该。
  • 哪个操作系统?我对 macOS 也有同样的问题,但 ctrl+h 输入了退格键。 FWIW,这里的 a solution to exercise 1-10 仅使用迄今为止在 K&R 的 C 书中使用的术语编写。

标签: c


【解决方案1】:

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

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

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

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

#include <stdio.h>

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

main()
{
    int c;

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多