gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 15:24:39 25 4
gpt4 key购买 nike

K&R C 1-10 阅读:

“编写一个程序将其输入复制到输出,用\t 替换每个制表符,用\b 替换每个退格符,用\替换每个反斜杠。这使得制表符和退格符以明确的方式可见。”

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

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

最佳答案

这是因为操作系统正在处理终端 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')) {
...

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

关于c - K&R 1-10,终端吃掉退格键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14206753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com