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

C语言每行输出单词时如何避免空行并去除多余空格?

解决K&R练习1-12:按每行一个单词输出(修复多余空行问题)

你要实现的是将输入按每行一个单词输出,核心需求是把连续的空格、制表符这类空白字符当成单个分隔符,同时不能输出多余空行。先分析你现有代码的问题:

初始代码的问题

每次遇到空格或制表符就输出换行,多个连续空白会触发多次换行,自然会产生多余空行。

你尝试的练习1-9思路代码的问题

  1. 只处理了空格,没覆盖制表符\t;
  2. 遇到空白字符后没有更新prevc,导致连续空白时,下一个空白仍会触发换行;
  3. 初始prevc设为'a',如果输入开头就是空白,会错误输出换行。

正确实现方案

方案一:用状态标记跟踪空白

#include <stdio.h>

int main(void)
{
    int c;
    int in_blank = 0; // 标记是否处于连续空白中

    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\t')
        {
            if (!in_blank)
            {
                putchar('\n');
                in_blank = 1;
            }
            // 连续空白,跳过输出
        }
        else
        {
            putchar(c);
            in_blank = 0;
        }
    }
    return 0;
}

逻辑说明:

  • in_blank标记当前是否在处理连续空白:第一次遇到空白时输出换行,之后的空白直接跳过;遇到非空白字符时输出,并重置标记。

方案二:修正你之前的“记录前字符”思路

#include <stdio.h>

int main(void)
{
    int c, prevc = '\n'; // 初始设为非空白,避免开头空白输出换行

    while ((c = getchar()) != EOF)
    {
        if (c == ' ' || c == '\t')
        {
            // 仅当前是空白且前一个不是空白时,才输出换行
            if (!(prevc == ' ' || prevc == '\t'))
            {
                putchar('\n');
            }
            prevc = c; // 更新前字符为当前空白
        }
        else
        {
            putchar(c);
            prevc = c;
        }
    }
    return 0;
}

逻辑说明:

  • 初始prevc设为换行符(非空白),避免输入开头是空白时错误输出换行;
  • 只有当前是空白且前一个字符不是空白时,才输出换行,同时更新prevc,确保连续空白不会重复输出换行。

测试输入hello everyone,两种方案的输出都是:

hello
everyone

完全符合需求,没有多余空行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:06:02