You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个实现字符替换的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:33:22