【问题标题】:C programming, Can anyone explain this?C编程,谁能解释一下?
【发布时间】:2016-08-16 17:25:36
【问题描述】:
#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 编译器和适用于 windows 的 mingw msys-gcc 包上运行。

【问题讨论】:

  • '\b' 是“退格”。所以你什么也得不到。
  • 是的,但是在第一个输出的情况下,我在“\t”之后得到一个“\”,当它应该打印“\\”时它只打印“\”
  • '\\' 是一个转义。通常单个'\'转义序列 的一部分,例如'\b'。放双斜线会破坏转义,将单斜线作为实际输出。与printf 中的"%" 类似,它通常表示格式规范。如果你真的想要一个百分号,你必须输入"%%" 来打败预期的序列。
  • 您使用putchar(c); 使用退格键跟随它。
  • 抱歉,哪个程序有问题?这个问题本身就令人困惑。我建议你尝试简单的程序。

标签: c gcc output execution input-buffer


【解决方案1】:

第二个程序出现这种行为的原因是因为您输入了多个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

【讨论】:

  • 谢谢,太棒了!我终于可以睡觉了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 2015-12-21
  • 2015-11-23
  • 2013-05-23
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多