shell和C程序之间的关系

时间:2017-07-05 19:27:10

标签: c shell stdin

我在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缓冲区?

我希望这些问题有意义。我花了一段时间才弄明白我想问的是什么,而且我不确定我是否已经完全理解了这一点。

2 个答案:

答案 0 :(得分:3)

getchar()从交互式控制台读取时,该功能将不会返回,直到 后按ENTER键。然后它将返回输入的第一个字符,并立即返回您输入的每个后续字符到换行符。

如果在按ENTER之前按下退格键,删除键或箭头键,终端将处理这些键击,并且只会在按ENTER键时发送“最终结果”。

如果您从重定向文件(即您将程序称为./myprog < input_file)或其他程序的管道输出(即./otherprog | ./myprog)中读取,那么getchar将返回正确离开每个角色,你会看到一切,包括控制字符和单独的UTF-8字节。

答案 1 :(得分:1)

这是因为退格字符在标准输入中永远不会到达getchar。当您键入退格键时,它只会取消您刚键入的字符。

如果您设法创建一个带有退格字符的文本文件,并将其提供给您的程序,那将会有效。