C编程,任何人都可以解释一下吗?

时间:2016-08-16 17:25:36

标签: c gcc output execution input-buffer

#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之后得到反斜杠,但是在\之后我得到{{1}成为查看\\\成为\t的方式的输出,是'\ b'导致它?如果是的话,它是如何工作的?但如果是这样的话,为什么第三个项目不会发生同样的事情?

在rasbian默认gcc编译器和mingw msys-gcc包中使用Windows。

1 个答案:

答案 0 :(得分: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