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
#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