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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是因为操作系统正在处理终端 IO,并在您的程序看到它们之前处理来自键盘的字符。
如果您在 Unix/Linux 系统上,您可以像这样包装程序的执行:
$ stty -icanon -echo; ./a.out; stty icanon echo
Run Code Online (Sandbox Code Playgroud)
这将禁用终端驱动程序以某些特定方式处理输入:icanon 启用退格处理等处理,而 echo 使您键入的字符被打印。由于您的程序会回显字符本身,因此您可以关闭回显。唯一的问题是 -icanon 也会停止 EOF 处理,因此您需要添加一个额外的条件以退出循环:
#include <stdio.h>
#define CTRL(x) (x & 0x1f)
main()
{
int c;
while((c = getchar()) != EOF && c != CTRL('d')) {
...
Run Code Online (Sandbox Code Playgroud)
在测试这样的程序时,在单独的窗口中运行它们也是一个好主意,这样如果你最终进入一个奇怪的终端模式,你可以快速轻松地终止整个会话!
| 归档时间: |
|
| 查看次数: |
2655 次 |
| 最近记录: |