C语言 如何对二维字符数组进行排序

bz4sfanl  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(180)

我正在编写一个程序,它打开一个文件(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数组中,并能够打印出来进行测试,但我不知道如何按长度排序。我找到了一些接近的想法,但第一个选项不适合我。第二个选项是接近,但排序它的字母顺序。

  1. option 1
  2. option 2
zdwk9cvp

zdwk9cvp1#

这里有一个可能的实现 * 使用硬编码数据 * 和特点qsort;注意,我还添加了lexicographic ordering,以防两个字符串长度相同。
用户必须进行必要的编辑来实现从文件导入。我只是展示排序功能的一个可能实现。

#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 -> %ld\n", data[i], strlen(data[i]));
    return 0;
}

代码执行here

68bkxrlz

68bkxrlz2#

第一次尝试没有成功,因为你没有指针数组,而是数组的数组,而且在本地分配如此巨大的数组也是不好的做法,因为这可能会导致堆栈溢出。
您可以像这样修复代码:

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

相关问题