如何排序二维字符数组



我正在编写一个程序,它打开一个文件(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

我source.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("ERRORn");
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数组中,并能够打印出来进行测试,但我不知道如何按长度排序。我找到了一些相近的想法,但第一个选择不适合我。第二个选项很接近,但它是按字母顺序排序的。

  1. 选项1
  2. 选项2

第一次尝试没有成功,因为您没有指针的数组,而是数组的数组。此外,在本地分配如此庞大的数组也是一种糟糕的做法,因为这可能导致堆栈溢出。

你可以像这样修改代码:

  • 改为char* data [MAX_LINES];
  • fgets放入MAX_LEN大小的临时缓冲区。
  • data分配读字符串,例如data[i] = strdup(tmpbuf);
  • 现在你可以使用qsort和比较回调函数发布在你的第一次尝试,因为它假设一个字符指针数组,这就是你现在拥有的。
  • 记住free()data[i]使用完成后。

这是一个可能的实现使用硬编码数据并具有qsort;注意,我还添加了字典顺序,以防两个字符串长度相同。

用户必须进行必要的编辑以实现从文件导入。我只是在展示排序函数的一种可能实现。

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LINES 6
int compare_lengths(const void *a, const void *b)
{
const char* str1 = *(const char* const*)a; // proper casting is crucial!
const char* str2 = *(const char* const*)b;
size_t len1 = strlen(str1);
size_t len2 = strlen(str2);
if (len1 < len2)
return -1;
if (len2 < len1)
return +1;
return strcmp(str2, str1); // same length -> sort lexicographically
}
int main(void) {
char *data[MAX_LINES] = {0};
data[0] = "hello world";
data[1] = "john Jones at Brook Mountains";
data[2] = "Frozen Styx";
data[3] = "altair";
data[4] = "John Doe and Jane Doe";
data[5] = "Cranium";
qsort(data, sizeof(data)/sizeof(char*), sizeof(char*), compare_lengths);
for (int i=0; i<MAX_LINES; ++i)
printf("%s -> %ldn", data[i], strlen(data[i]));
return 0;
}

代码在这里起作用。

最新更新