如何修改C语言程序以获取输入文件中最短行的字符数?
如何修正C程序以正确获取文件中最短行的字符数?
我来帮你拆解代码里的问题,一步步修正到符合需求:
问题分析
你的代码之所以输出错误结果,核心是三个逻辑失误,还有一些可以优化的细节:
- 初始值设置错误:你把
shortestLine初始化为0,但所有行的字符数都大于0,后续循环又直接覆盖这个值,完全失去了“记录最短”的作用。 - 比较逻辑完全颠倒:
if(shortestLine < countAllChars(inp))这个判断是在当前行比已记录的“最短”更长时更新变量,最后得到的必然是最长行的长度,和需求完全相反。 - 冗余的函数调用:每次循环重复调用3次
countAllChars(inp),既浪费性能,也让代码可读性变差。 - 无效的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; }
关键修改说明
- 初始值改为
INT_MAX:这是<limits.h>定义的int类型最大值,确保第一行的字符数一定会小于它,从而正确初始化最短记录。 - 修正比较逻辑:改成
if(currentCount < shortestLine),只有当前行的字符数比已记录的更短时,才更新变量。 - 复用临时变量:把
countAllChars的结果存在currentCount里,避免重复计算,代码更简洁。 - 优化
fgets参数:用sizeof(inp)代替硬编码的长度,提升代码的可维护性。 - 增加空输入判断:如果输入是空文件,
shortestLine会保持INT_MAX,此时输出提示信息更友好。 - 移除无效判断:删掉
countAllChars里的inp[i] == EOF,让函数逻辑更清晰。
用你提供的input.txt测试,这个程序会正确输出3。
内容的提问来源于stack exchange,提问作者josef_uncovsky
相关产品推荐
相关产品推荐

