C编程语言,第1版,练习1-8 ---不能出现箭头

时间:2014-04-04 15:18:02

标签: c mingw

我正在浏览Kernighan和Ritchie的 The C Programming Language ,并且遇到了其中一个练习的问题。我相信,我正在使用第一版和练习1-8:

编写一个程序,用三个字符的序列>,退格符号 - 替换每个标签,打印为(右向箭头),每个退格按相似的顺序(左向箭头)。这使标签和退格显示。我的代码显示如下:

#include<stdio.h>

int c;

main(){
    while((c = getchar()) != EOF){
        if(c == '\t'){
            putchar('>');
            putchar('\b');
            putchar('-');
        }
        else if(c == '\b'){
            putchar('<');
            putchar('\b');
            putchar('-');
        }
        else
            putchar(c);
        }
    }

我正在使用MinGW编译器,当我运行代码时,我得到一堆破折号,没有任何箭头方式。我也没有看到&lt;或者&gt;一点都不我尝试查找其他人对此练习的解决方案,但我发现的只是本书的第二版,并且相应的练习让你计算标签。最后,我尝试使用三个putchar()来运行代码以使箭头无效;我只是再次得到同样的破折号。

有人可以对此有所了解吗?

希望收到你的来信,

Yusif Nurizade

2 个答案:

答案 0 :(得分:2)

这是正常的。

putchar('>');   // prints the '>'
putchar('\b');  // prints a backspace which erases the previously printed '>'

修改

实际上我的系统上有以下程序:

void main()
{
   while((c = getchar()) != EOF){
     printf ("%d\n",  c) ;
}

此输入([Bs] =退格键按下,[Enter] =按下Enter键)

 ABCDEF[Bs][Bs][Bs][Enter]

我得到了这个输出:

65
66
67
10

而不是:

65
66
67
68
69
70
8
8
8
10

因为在我的系统上,getchar()不会返回退格。 8是BS(Backspace)的ASCII码。

答案 1 :(得分:2)

基本问题是程序是为过时的系统编写的。

如果您在具有典型输入设置的典型系统上运行该程序,程序将永远不会看到退格符。

在类Unix系统上,标准输入(stdin)通常一次处理一行;一次读取一个字符的程序从内部缓冲区读取。当您键入退格键时,它不会向您的程序发送退格符;它实际上从其内部缓冲区中删除了前一个字符。

例如,如果您键入&#34; abcx Backspace def&#34;,程序将只会看到&#34; abcdef&#34;。

如果您使用的是类Unix系统,则可以在 Ctrl-V 之前输入文字退格。键盘上的 Backspace 键可能会映射到 Delete ;如果是这样,请尝试 Ctrl-V Ctrl-H 发送文字退格符。

(如果您不是类Unix系统,可能有办法做类似的事情,但我不知道它是什么。)

但即便如此,正如Michael Walz's answer指出的那样,程序使用的那种过度打击(打印&gt;退格 - 打印右箭头)几乎肯定只能在硬拷贝终端上运行。在现代显示终端上,退格区将简单地删除前一个字符。

重复我在评论中所写的内容:第一版的Kernighan&amp; Ritchie(K&amp; R1)于1978年出版,确实是一部经典之作,但它描述了一种过时的C语言预标准版本。自发布以来最大的变化可能是添加了 prototypes ,函数声明指定了参数的类型;它们在1978年并不存在,但未能在现代C代码中使用原型是非常糟糕的做法。如果您可以获得第二版的副本,请执行此操作。它可以在Kindle和Nook以及死树上使用。 (即使是1989年出版的第二版,有点过时了,但你仍然可以从中学习C;好的C89 / C90代码通常仍然是很好的C99和C11代码。)