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

C语言如何读取未知数量字符串并按长度升序排序输出?

现有代码存在的问题
  • 二维数组行维度未定义:你定义的line[MAXLINE][MAXLINE]第一维也用了MAXLINE,逻辑上不合理,应该单独定义最大输入行数常量,比如MAXROW,表示最多支持多少行输入,单条字符串最大长度用原有的MAXLINE即可。
  • 变量未初始化:计数变量i、长度变量len未赋初始值,初始为随机值,导致计数完全错误。
  • gets传参错误:每次调用gets(line)都会把输入内容写入第0行,覆盖原有内容,应该传入当前待写入行的地址line[i]。
  • 输入计数逻辑错误:每次读取成功后i自增,循环结束后i本身就是输入的总行数,不需要额外计算len=i+1。
  • 排序逻辑错误:内层循环边界k<len-j-1错误,会导致后半部分行未参与比较;交换逻辑顺序错误,copy(line[j],line[k])会直接覆盖line[k]的原值,导致交换失败。
  • gets函数安全风险:gets已经被C标准废弃,无法限制输入长度,容易造成缓冲区溢出,作业场景可保留但需要注意输入长度不超过MAXLINE-1。
实现方案
  1. 新增最大输入行数定义:在copy.h中添加#define MAXROW 100,表示最多支持100行输入,可根据需求调整数值。
  2. 初始化计数变量:i初始值设为0,读取结束后len直接赋值为i。
  3. 修正读取逻辑:每次读取到line[i],读取成功后i自增,超过最大行数时停止读取避免越界。
  4. 修正排序逻辑:调整内层循环边界为k < len,交换顺序调整为:先备份line[j]到tmp,再把line[k]拷贝到line[j],最后把备份的tmp拷贝到line[k]。
  5. 输入结束方式:Windows下按Ctrl+Z+回车结束输入,Linux/Mac下按Ctrl+D结束输入。
修正后完整代码

copy.h

#define MAXLINE 100
#define MAXROW 100 // 新增最大输入行数定义
void copy(char from[], char to[]);

copy.c

void copy(char from[], char to[])
{
    int i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

主函数文件

#include <stdio.h>
#include <string.h>
#include "copy.h"

char line[MAXROW][MAXLINE];
char tmp[MAXLINE];
int main () {
    int i = 0, len, j, k;
    // 读取输入
    while(gets(line[i]) != NULL) {
        i++;
        // 超过最大行数时停止读取,避免越界
        if (i >= MAXROW) break;
    }
    len = i;
    // 按字符串长度升序排序
    for(j = 0; j < len - 1; j++){
        for(k = j + 1; k < len; k++){
            if (strlen(line[j]) > strlen(line[k])){
                copy(line[j], tmp);
                copy(line[k], line[j]);
                copy(tmp, line[k]);
            }   
        }
    }
    // 输出结果
    for(j = 0; j < len; j++){
        printf("%s\n", line[j]);
    }
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 16:15:05