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

C语言输入字符串逐词打印问题:多空格分隔时出现多余空行如何修复?

问题修复方案

问题原因

现有代码的逻辑是每遇到一个空格就输出一次换行,所以单词间的多个连续空格会对应输出多个连续换行,最终出现多余空行。你代码中已经定义了inw(标记是否处于单词内部)变量,刚好可以用来解决这个问题。

修复思路

通过inw变量记录当前字符的状态:

  • 只有当从「单词内部」第一次遇到空格时,才输出换行
  • 连续遇到多个空格时,仅第一个空格触发换行,后续空格直接跳过
  • 额外优化:替换已被C标准废弃的gets()函数为更安全的fgets(),避免缓冲区溢出风险

修复后完整代码

#include <stdio.h>

int main()
{
    int inw = 0, i = 0;
    char s[10000];
    printf("Print string (max 10000 char):\n");
    // 替换gets为fgets,避免缓冲区溢出
    fgets(s, sizeof(s), stdin);
    while (s[i] != '\0') {
        if (s[i] != ' ' && s[i] != '\t' && s[i] != '\n') {
            inw = 1;
            putchar(s[i]);
        } else {
            // 只有当前处于单词内时,遇到分隔符才输出换行
            if (inw == 1) {
                printf("\n");
                inw = 0;
            }
        }
        i++;
    }
    return 0;
}

修改点说明

  • 启用inw状态标记:进入单词时设为1,离开单词输出换行后设为0
  • 调整空格判断逻辑:仅首次遇到单词分隔符时输出换行,连续分隔符不重复输出
  • 替换gets()为fgets():解决原函数的缓冲区溢出安全隐患

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:03