2016-08-16 139 views
0
#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; 
} 

在这种情况下的C编程,任何人都可以解释这一点吗?

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软件包进行了修改。

+2

''\ b''是“退格”。所以你什么也得不到。 –

+0

是的,但在第一次输出的情况下,我在“\ t”后面得到一个“\”,当它打印出“\\”时,它只是打印“\” – user6723034

+3

''\\''是一个*转义* 。通常,单个的'''是*转义序列*的一部分,例如''\ b''。双斜线击败逃跑,给出一个单一的斜线作为实际输出。与'printf'中的'%''类似,通常表示格式规范。如果你真的想要一个百分号,你必须把'“%%”'打败预期的序列。 –

回答

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 
+0

谢谢你,那太棒了!我现在终于可以睡了。 – user6723034

相关问题