#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。
答案 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