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

如何修改C语言程序以获取输入文件中最短行的字符数?

如何修正C程序以正确获取文件中最短行的字符数?

我来帮你拆解代码里的问题,一步步修正到符合需求:

问题分析

你的代码之所以输出错误结果,核心是三个逻辑失误,还有一些可以优化的细节:

  1. 初始值设置错误:你把shortestLine初始化为0,但所有行的字符数都大于0,后续循环又直接覆盖这个值,完全失去了“记录最短”的作用。
  2. 比较逻辑完全颠倒:if(shortestLine < countAllChars(inp))这个判断是在当前行比已记录的“最短”更长时更新变量,最后得到的必然是最长行的长度,和需求完全相反。
  3. 冗余的函数调用:每次循环重复调用3次countAllChars(inp),既浪费性能,也让代码可读性变差。
  4. 无效的EOF判断:countAllChars里的inp[i] == EOF永远不会成立——fgets不会把EOF存入数组,EOF是用来判断输入结束的返回值,不是数组里的字符。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>  // 引入INT_MAX的定义

int countAllChars(char inp[]) {
    int charCount = 0;
    for(int i = 0; inp[i] != '\0'; i++) {
        // 只跳过换行符,因为fgets会把换行符读入数组
        if(inp[i] == '\n') {
            continue;
        }
        charCount++;
    }
    return charCount;
}

int main() {
    // 初始化为int类型的最大值,确保第一行的字符数肯定比它小
    int shortestLine = INT_MAX;
    char inp[1000];
    
    // 用sizeof(inp)代替硬编码的100,数组大小变化时无需手动修改
    while(fgets(inp, sizeof(inp), stdin)) {
        // 把当前行的字符数存入临时变量,避免重复调用函数
        int currentCount = countAllChars(inp);
        // 只有当前行更短时,才更新最短记录
        if(currentCount < shortestLine) {
            shortestLine = currentCount;
        }
    }
    
    // 处理空输入的情况
    if(shortestLine != INT_MAX) {
        printf("Shortest line is --> %d\n", shortestLine);
    } else {
        printf("No input received.\n");
    }
    
    return 0;
}

关键修改说明

  1. 初始值改为INT_MAX:这是<limits.h>定义的int类型最大值,确保第一行的字符数一定会小于它,从而正确初始化最短记录。
  2. 修正比较逻辑:改成if(currentCount < shortestLine),只有当前行的字符数比已记录的更短时,才更新变量。
  3. 复用临时变量:把countAllChars的结果存在currentCount里,避免重复计算,代码更简洁。
  4. 优化fgets参数:用sizeof(inp)代替硬编码的长度,提升代码的可维护性。
  5. 增加空输入判断:如果输入是空文件,shortestLine会保持INT_MAX,此时输出提示信息更友好。
  6. 移除无效判断:删掉countAllChars里的inp[i] == EOF,让函数逻辑更清晰。

用你提供的input.txt测试,这个程序会正确输出3。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 21:12:50