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

K&R《C程序设计语言》练习1-9:连续空格替换程序失效排查

《C程序设计语言》练习1-9程序错误排查与修复

错误原因

你的程序在遇到空格后陷入死循环,导致后续输入无法处理:

  • 当外层循环读到空格时,先输出这个空格,然后进入内层while(c == ' ')循环。但这个循环里没有任何代码更新c的值,c会一直保持为空格,循环条件永远成立,程序卡在这个内层循环里,再也不会读取新的输入,自然也就无法输出后续内容。

修复方法

基于你掌握的C语言基础(变量、循环、条件判断、字符I/O),可以通过添加一个标记变量来跟踪前一个字符是否为空格,实现连续空格替换为单个空格的需求:

#include <stdio.h>

int main() // 标准C要求main函数返回int类型
{
    int c;
    int is_last_char_space = 0; // 标记前一个字符是否是空格,初始为0(非空格)

    while ((c = getchar()) != EOF) {
        if (c == ' ') {
            // 只有当前一个字符不是空格时,才输出这个空格
            if (!is_last_char_space) {
                putchar(c);
                is_last_char_space = 1; // 更新标记为“前一个是空格”
            }
            // 如果前一个已经是空格,跳过当前空格,不输出
        } else {
            putchar(c);
            is_last_char_space = 0; // 更新标记为“前一个不是空格”
        }
    }
    return 0; // 标准C要求main函数返回值
}

逻辑说明

  1. 用is_last_char_space变量记录上一个输出的字符是否为空格:
    • 当读到空格时,只有标记为“非空格”时才输出,并把标记改为“是空格”;
    • 当读到非空格字符时,直接输出,并把标记改回“非空格”;
  2. 这样就能自动合并连续的空格,只保留第一个空格输出。

另外补充:原代码里main()没有返回类型和返回值,这是旧C标准的写法,建议改成标准的int main()并返回0,避免编译警告。

内容的提问来源于stack exchange,提问作者GPWR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:50:58