我正在浏览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
答案 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代码。)