1
#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但不是在\我期望\\\的输出之后,看看 how \tbecome \t\,是 '\b' 导致它? 如果是,它是如何工作的?但如果是这样,为什么在第三个程序中不会发生同样的情况?

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

4

1 回答 1

2

第二个程序这样做的原因是因为您输入了多个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
于 2016-08-16T18:31:33.117 回答