C编程,谁能解释一下?

C programming, Can anyone explain this?

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t')
            printf("\t");
        else if (c == '\b')
            printf("\b");
        else if (c == '\')
            printf("\\");
        else 
            putchar(c);
    }
    return 0;
}   

在这种情况下输入

hi how are you\doing

我得到一个输出

hi\thow\tare\tyou\doing

#include <stdio.h>

int main() {
    int c;

    while ((c = getchar()) != EOF) {
        if (c == '\t') {
            c = '\b';
            printf("\t");
        }
        if (c == '\b') {
            c = '\b';
            printf("\b");
        }
        if (c == '\') {
            c = '\b';
            printf("\\");
        }
        putchar(c);
    }
    return 0;
}   

当我运行这个程序输入

hi    how    are    you\doing

(大空格是制表符)

我得到这个输出

hi\t\how\t\are\t\you\doing

代码:

#include <stdio.h>

int main() {
    int c;
    c = '\b'; 
    putchar(c);
    return 0;
}

在运行宁此, 我什么也得不到。无输出。返回 shell 提示符。

更准确地说,在第一个程序中,我得到了我想要的输出,但在第二个程序中,我在每个 \t 之后得到了反斜杠,但在 \ 之后却没有,我希望 \\ 是查看 \t 如何变成 \t\ 的输出,是 '\b' 引起的吗?如果是,它是如何工作的?但如果是这样,为什么第三个程序中没有发生同样的事情呢?

运行 这个在 rasbian 默认 gcc 编译器和 mingw msys-gcc 包上 windows.

第二个程序出现这种情况的原因是因为您输入了多个 if 块:

    if (c == '\t') {
        c = '\b';
        printf("\t");
    }
    if (c == '\b') {
        c = '\b';
        printf("\b");
    }
    if (c == '\') {
        c = '\b';
        printf("\\");
    }
    putchar(c);

当您遇到制表符时,会输入第一个块,它会在屏幕上打印 \t,然后 c 更改为退格键

然后输入第二个块,因为 c 是退格键(因为您刚刚将其更改为退格键)。然后该块将 \b 打印到屏幕上,所以现在屏幕上显示了 \t\b

当您随后调用 putchar 写入退格键时,b 将被下一个字符覆盖。因此,当写入下一个字符时,屏幕上就会出现 \t\

所以这里的问题是您要多次测试 c 并可能在两者之间进行更改。仅在选项卡上发生这种情况的原因是您首先检查选项卡,然后是退格键,然后是反斜杠。

如果您使用 else if 而不是 if,您将不会输入多个块:

if (c == '\t') {
    c = '\b';
    printf("\t");
}
else if (c == '\b') {
    c = '\b';
    printf("\b");
}
else if (c == '\') {
    c = '\b';
    printf("\\");
}
putchar(c);

有了这个改变,给定原始输入,输出将是:

hi\how\are\you\doing