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。
实现方案
- 新增最大输入行数定义:在
copy.h中添加#define MAXROW 100,表示最多支持100行输入,可根据需求调整数值。 - 初始化计数变量:
i初始值设为0,读取结束后len直接赋值为i。 - 修正读取逻辑:每次读取到
line[i],读取成功后i自增,超过最大行数时停止读取避免越界。 - 修正排序逻辑:调整内层循环边界为
k < len,交换顺序调整为:先备份line[j]到tmp,再把line[k]拷贝到line[j],最后把备份的tmp拷贝到line[k]。 - 输入结束方式: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
相关产品推荐
相关产品推荐

