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

C语言实现从stdin读取单词文件并统计最短字符串长度

C程序获取字符串最小长度修改方案

现有代码核心问题

  • 函数功能错位:命名为min_stat的函数实际仅实现了字符串长度统计,没有最小值计算相关逻辑
  • 无全局最小值维护:每次计算单行长度后直接打印,未定义变量存储全局最小长度、也没有做大小比对更新
  • 参数校验逻辑错误:argc < 1的判断永远不会触发,程序运行时argc至少为1(argv[0]存储程序自身路径),要校验是否传入运行参数应该判断argc < 2,否则直接访问argv[1]会触发内存越界
  • 长度统计额外多1:fgets读取行内容时会把末尾的\n换行符也计入缓冲区,你示例中统计到Hello长度为6、Hi长度为3就是包含了换行符的结果,如果只需要统计纯单词长度需要额外去除换行符

具体修改步骤

  1. 在读取文件的循环外初始化最小长度变量为一个极大值(可使用limits.h头文件定义的INT_MAX常量,代表int类型的最大值)
  2. 每次计算得到当前行的长度后,和当前最小长度比对,若当前长度更小则更新最小长度
  3. 所有行读取完成后再统一打印最终的最小长度
  4. 修正参数校验逻辑,避免越界访问
  5. 可选:如果需要统计纯单词长度(不含末尾换行符),在统计长度前将缓冲区末尾的换行符替换为字符串结束符\0即可

修改后完整代码

#include <stdio.h>
#include <limits.h>
#include <string.h>

// 原函数实际为计算字符串长度,更名更清晰
int get_str_len(char str[])
{
    int len = 0;
    for(int i=0; str[i] != '\0'; i++)
    {
        len++;   
    }
    return len;
}

int main(int argc, char *argv[])
{
    // 修正参数校验:判断是否传入了参数
    if(argc < 2){
        fprintf(stderr,"Error: missing parameter\n");
        return 1;
    }

    char param = argv[1][0];
    const int val = 100;
    char buffer[val];
    if(param == '1')
    {
        // 初始化最小长度为int最大值
        int min_len = INT_MAX;
        while(fgets(buffer, val, stdin) != NULL)
        {
            // 可选:去掉末尾换行符,统计纯单词长度,不需要可以注释掉下一行
            buffer[strcspn(buffer, "\n")] = '\0';
            
            int cur_len = get_str_len(buffer);
            // 比对更新最小值
            if (cur_len < min_len) {
                min_len = cur_len;
            }
        }
        // 所有行读取完成后打印最小值
        printf("%d\n", min_len);
    }
    return 0;
}

运行验证

按照你的示例输入,保留换行统计的话输出为3,去掉换行统计的话输出为2,符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 01:24:01