我在“C编程语言”中看到一个问题,它是这样的: 编写程序将其输入复制到其输出,用\ 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',即。我的意思是,我如何输出退格?
答案 0 :(得分:4)
键盘输入由操作系统预处理。大多数字符直接作为输入提供给您的程序,但有些字符是专门处理的。
在类UNIX系统上,标准输入通常是行缓冲的。系统会读取整行文本,并且在您按 Enter 之前不会将其传递给您的程序。在读取该行时,系统处理 Backspace 本身;它不是在缓冲区中添加退格符,而是删除最新的字符。您的程序永远不会看到'\b'
字符。
要输入程序可以看到的文字退格符,在类UNIX系统上,可以在其前面加上Ctrl-V。根据您的tty和终端仿真器设置,键入 Backspace 键可能会传输ASCII DEL字符而不是退格。要确保程序看到退格符,请键入 Ctrl-V Ctrl-H 。
在非类UNIX系统(很可能是Windows)上,可能有一种类似的方法,但我不知道它是什么。
您还可以使用文件输入来运行程序。在输入文件中输入文字退格字符作为练习(取决于文本编辑器的工作方式)。
答案 1 :(得分:1)
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;
}
getch将{p> Enter
检测为\r
,因此如果您想转到下一行,则必须手动将其替换为\n
答案 2 :(得分:0)
退格通常被外壳吃掉。使用&#34; crtl-h&#34;测试退格。
有关详细信息http://www.tldp.org/HOWTO/Keyboard-and-Console-HOWTO-5.html
,请参阅此页面答案 3 :(得分:0)
在您的代码中,您有三个if
,最后只有一个其他人...所以您的其他内容仅与最后一个if
相关联。对于制表符和退格键,由于它们不是反斜杠,因此最后if
测试为false,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);
}