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

C语言fgets实现单单词逐行输出问题:多余空行排查求助

问题原因与解决方案

这个问题我之前也碰到过,根源在于fgets的一个容易忽略的特性——它会把你输入时按下的回车键(也就是换行符\n)也一起读取并存入数组里,而不是像你以为的那样只读取单词本身。

具体原因分析

当你输入一个无空格单词然后按回车时,fgets会把以下内容依次存入array数组:

  • 单词的每个字符
  • 换行符\n(你按下回车产生的)
  • 字符串结束符\0(自动添加的)

你的循环条件是array[i] != '\0',所以那个\n也会被遍历到,然后执行printf("%c\n", array[i])——这就相当于先打印一个换行(来自\n本身),再打印一个printf自带的换行,直接就多出来两行空行啦。

解决方法:提前移除换行符

我们只需要在读取完字符串后,把数组里的\n替换成\0,让循环提前终止即可。这里有两种常用方式:

方式一:手动遍历替换

#include <stdio.h>
#define MAX_LINE 4096
int main(void) {
    int i;
    char array[MAX_LINE];
    printf("Enter a string: ");
    fgets(array,MAX_LINE,stdin);
    
    // 遍历找到换行符并替换为结束符
    for (i = 0; array[i] != '\0'; i++) {
        if (array[i] == '\n') {
            array[i] = '\0';
            break;
        }
    }
    
    for(i=0; array[i]!='\0'; i++){
        printf("%c\n",array[i]);
    }
    return 0;
}

方式二:用strcspn函数简化(推荐)

strcspn会返回字符串中第一个指定字符的位置,我们可以用它快速定位\n并替换:

#include <stdio.h>
#include <string.h> // 需要包含这个头文件
#define MAX_LINE 4096
int main(void) {
    int i;
    char array[MAX_LINE];
    printf("Enter a string: ");
    fgets(array,MAX_LINE,stdin);
    
    // 直接把换行符替换为结束符
    array[strcspn(array, "\n")] = '\0';
    
    for(i=0; array[i]!='\0'; i++){
        printf("%c\n",array[i]);
    }
    return 0;
}

额外说明

如果用户输入的字符串长度刚好达到MAX_LINE-1,fgets会因为达到长度限制而不读取换行符,这时候上面的代码也不会出错——strcspn会返回字符串的长度,替换\0到数组末尾不会产生任何问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:45:06