如何将退格键更改为 '\b'?
Posted
技术标签:
【中文标题】如何将退格键更改为 \'\\b\'?【英文标题】:how can I change backspace to '\b'?如何将退格键更改为 '\b'? 【发布时间】:2014-11-13 00:48:50 【问题描述】:我在《The C programming language》中看到一个问题,是这样的: 编写一个程序将其输入复制到其输出,用 \t 替换每个制表符,用 \b 替换每个退格键,用 \ 替换每个反斜杠。这使得标签和
退格以明确的方式可见。 然后我写一个这样的程序
#include<stdio.h>
int main(void)
int c;
while((c=getchar())!=EOF)
if(c=='\t')
putchar('\\');
putchar('t');
if(c=='\b')
putchar('\\');
putchar('b');
if(c=='\\')
putchar('\\');
putchar('\\');
else
putchar(c);
return 0;
但是当我输入退格时,我不能得到'\b',那么我怎样才能得到输出'\b',即我的意思是,我怎样才能输出退格?
【问题讨论】:
你得到了什么输出?选项卡的行为是否正确? 我认为没有一个简单的答案。这取决于您的终端等 - 它可能会缓冲您键入的所有内容,然后在您按 Enter 时将其发送到您的程序。如果是这种情况,它可能会为您处理退格,而您的程序将永远不会看到它们。 我相信puts
可能效率更高,比如puts("\\t");
。它将两个函数调用替换为一个。
switch
语句更易读,恕我直言。
您的 else
仅与最后一个 if
相关联,因此您在 '\t' 和 '\b' 的转义序列之后打印原始字符......所以实际退格字符可能会在您打印后吃掉“b”。
【参考方案1】:
键盘输入由操作系统预处理。大多数字符直接作为输入输入到您的程序中,但有些字符是经过特殊处理的。
在类 UNIX 系统上,标准输入通常是行缓冲的。系统会读取整行文本并且在您按下 Enter 之前不会将其传递给您的程序。在读取该行时,系统会自行处理 Backspace;它不会在缓冲区中添加退格字符,而是删除最近的字符。您的程序永远不会看到 '\b'
字符。
要输入程序可以看到的文字退格字符,在类 UNIX 系统上,您可以在其前面加上 Ctrl-V。根据您的 tty 和终端仿真器设置,键入 Backspace 键可能会传输 ASCII DEL 字符而不是退格。要确保您的程序看到退格字符,请键入 Ctrl-V Ctrl-H。
在非类 UNIX 系统(很可能是 Windows)上,可能有一种方法可以做类似的事情,但我不知道它是什么。
您还可以使用来自文件的输入来运行您的程序。将文字退格字符放入输入文件中作为练习(这取决于您的文本编辑器的工作方式)。
【讨论】:
不错的答案,您可以使用getch()
检测每个按键
@Ludovic:至少有两个函数叫做getch
。一种是特定于 Windows 的;另一个是 [n] 个诅咒的一部分。
不知道,谢谢!我会努力改进我的答案【参考方案2】:
getchar
函数缓冲用户输入并仅在用户按下回车时将其发送到您的程序。按照建议,您必须使用getch()
来检测每个按键
您的代码必须是:
#include<stdio.h>
#include<conio.h>
int main(void)
int c;
while ((c = getch()) != EOF)
if (c == '\t')
putchar('\\');
putchar('t');
else if (c == '\b')
putchar('\\');
putchar('b');
else if (c == '\\')
putchar('\\');
putchar('\\');
else if (c == '\r')
putchar('\n');
else
putchar(c);
return 0;
Enter
被 getch 检测为\r
,所以如果你想进入下一行,你必须手动将其替换为\n
【讨论】:
【参考方案3】:退格键通常会被 shell 吃掉。使用“crtl-h”来测试退格。
查看此页面了解更多详情http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html
【讨论】:
仅当您的配置导致 Backspace 键发送 DEL 字符时才有效。【参考方案4】:在您的代码中,您有三个 if
s,最后只有一个 else...所以您的 else 只与最后一个 if
相关联。对于制表符和退格,因为它们不是反斜杠,所以最后一个if
测试为假,else
块执行打印原始字符。这意味着在打印 '\t' 之后,您会打印一个选项卡(并且可能会在输出中看到一些空白区域),并且在打印 '\b' 之后,您会打印一个退格,它会吃掉 'b' 或导致它被下一个覆盖特点。要修复它,请使用:
if(c == '\t')
putchar('\\');
putchar('t');
else if(c=='\b') /* "else if" rather than "if" */
putchar('\\');
putchar('b');
else if(c=='\\')
putchar('\\');
putchar('\\');
else
putchar(c);
...或者简单地用开关重写它:
switch(c)
case '\t':
puts("\\t");
break;
case '\b':
puts("\\b");
break;
case '\\':
puts("\\\\");
break;
default:
putchar(c);
【讨论】:
以上是关于如何将退格键更改为 '\b'?的主要内容,如果未能解决你的问题,请参考以下文章