繁体   English   中英

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'引起的吗? 如果是,它如何工作? 但是如果是这样,为什么在第三程序中不会发生同样的事情?

在用于Windows的rasbian默认gcc编译器和mingw msys-gcc程序包上运行该程序。

第二个程序采用这种方式的原因是因为您输入了多个if块:

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

遇到选项卡时,将输入第一个块,并在其中将\\t打印到屏幕上,然后c更改为backspace

然后输入第二个块,因为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM