两个实现字符替换的C语言循环程序为何运行结果不同?
C语言习题1-10程序运行差异原因分析
我是C语言初学者,正在学习Brian W.Kerninghan和Dennis M.Ritchie所著的《The C Programming Language (Second Edition)》,目前卡在习题1-10。该习题要求编写程序将输入复制到输出,将每个制表符替换为\t、退格符替换为\b、反斜杠替换为\\,使这些特殊字符清晰可见。
我编写的程序如下:
#include<stdio.h> int main(void) { int c; while ((c = getchar()) != EOF) { if (c == '\t') { putchar('\\'); putchar('t'); } if (c == '\b') { putchar('\\'); putchar('b'); } if (c == '\\') { putchar('\\'); putchar('\\'); } else { putchar(c); } } }
运行结果异常,示例如下:
C:\C>gcc Replace2.c C:\C>a tab is like this tab\t is\t like\t this
随后找到的正确实现程序:
#include <stdio.h> int main() { int c, d; while ((c = getchar()) != EOF) { d = 0; if (c == '\\') { putchar('\\'); putchar('\\'); d = 1; } if (c == '\t') { putchar('\\'); putchar('t'); d = 1; } if (c == '\b') { putchar('\\'); putchar('b'); d = 1; } if (d == 0) putchar(c); } return 0; }
运行结果正常,示例如下:
C:\C>gcc Replace2.c C:\C>a tab is like this tab\tis\tlike\tthis
差异原因
你的程序逻辑存在核心错误:
- 代码中的
else仅属于最后一个if (c == '\\'),并非前面所有if语句的配套分支。 - 当输入是制表符
\t时,第一个if会执行输出\t,但因为c != '\\',会触发最后一个else,把原制表符也输出一遍——这就是输出中既有替换后的\t又保留原制表符空格的原因。 - 同理,输入退格符
\b时,也会先输出替换后的\b,再输出原退格符;只有输入反斜杠时,最后一个if成立,不会走else,所以反斜杠的替换是正常的。
参考程序的逻辑更严谨:
- 用标记变量
d记录是否已处理特殊字符,初始设为0。 - 每处理一个特殊字符,就将
d设为1。 - 最后仅当
d == 0(未处理过特殊字符)时才输出原字符,从根本上避免了重复输出的问题。
内容的提问来源于stack exchange,提问作者satoru kurita
相关产品推荐
相关产品推荐

