我在K& R第一章的练习中写了以下代码。代码按预期替换了制表符和反斜杠,但它不会用\ 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');
printf("\\b");
}
if (c == '\\')
{
putchar('\\');
putchar('\\');
}
if (c != '\t' && c != '\b' && c != '\\')
{
putchar(c);
}
}
return 0;
}
我查看了Stack Overflow。 this问题的答案谈论shell消耗退格,结果是我编写的代码永远不会看到退格。这让我想到了一个问题:我在键盘上提供的输入会发生什么?我假设这成为stdin流的一部分。但很明显,并非我输入的所有字符都会出现在我的代码中。有人可以解释我的键击和我的代码处理输入之间发生了什么处理?此外,在此处理发生之前,我的代码是否有办法读取stdin缓冲区?
我希望这些问题有意义。我花了一段时间才弄明白我想问的是什么,而且我不确定我是否已经完全理解了这一点。
答案 0 :(得分:3)
当getchar()
从交互式控制台读取时,该功能将不会返回,直到 后按ENTER键。然后它将返回输入的第一个字符,并立即返回您输入的每个后续字符到换行符。
如果在按ENTER之前按下退格键,删除键或箭头键,终端将处理这些键击,并且只会在按ENTER键时发送“最终结果”。
如果您从重定向文件(即您将程序称为./myprog < input_file
)或其他程序的管道输出(即./otherprog | ./myprog
)中读取,那么getchar
将返回正确离开每个角色,你会看到一切,包括控制字符和单独的UTF-8字节。
答案 1 :(得分:1)
这是因为退格字符在标准输入中永远不会到达getchar
。当您键入退格键时,它只会取消您刚键入的字符。
如果您设法创建一个带有退格字符的文本文件,并将其提供给您的程序,那将会有效。