我正在编写一个程序,它打开一个文件(input.txt)并将行读入一个2D数组,这样我就可以按长度对行进行排序。
这些是我创建的测试语句 (input.txt)
1. hello world
2. john Jones at Brook Mountains
3. Frozen Styx
4. altair
5. John Doe and Jane Doe
6. Cranium
我的来源. c
#define MAX_LINES 100
#define MAX_LEN 1000
int main(void) {
char data[MAX_LINES][MAX_LEN];
FILE* fread = fopen("C:\\Users\\EXAMPLE\\desktop\\input.txt", "r");
if (fread == NULL) {
printf("ERROR\n");
return 1;
}
int line = 0;
while (!feof(fread) && !ferror(fread)) {
if (fgets(data[line], MAX_LEN, fread) != NULL) {
line++;
}
}
fclose(fread);
for (int i = 0; i < line; i++) {
printf("%s", data[i]);
}
return 0;
}
我设法复制了这些行并将它们输入到一个2D数组中,并能够打印出来进行测试,但我不知道如何按长度排序。我找到了一些接近的想法,但第一个选项不适合我。第二个选项是接近,但排序它的字母顺序。
2条答案
按热度按时间zdwk9cvp1#
这里有一个可能的实现 * 使用硬编码数据 * 和特点qsort;注意,我还添加了lexicographic ordering,以防两个字符串长度相同。
用户必须进行必要的编辑来实现从文件导入。我只是展示排序功能的一个可能实现。
代码执行here。
68bkxrlz2#
第一次尝试没有成功,因为你没有指针数组,而是数组的数组,而且在本地分配如此巨大的数组也是不好的做法,因为这可能会导致堆栈溢出。
您可以像这样修复代码:
char* data [MAX_LINES];
MAX_LEN
大小的临时缓冲区中执行fgets
。data
,例如data[i] = strdup(tmpbuf);
。qsort
和比较回调函数,因为它假设了一个字符指针数组,这就是您现在所拥有的。data[i]
执行一次free()
。