首页 > 解决方案 > 通过 sort() 对 char[] 数组进行排序不起作用

问题描述

我是 C++ 新手,所以我想了解为什么以下代码不起作用:

std::sort(arr, arr + j);
for (int i = 0; i < j; i++) {
    cout << arr[i] << "\n";
}

输入 I 测试:a, u, m

我期望的输出:a, m, u

但是越来越不动了a, u, m

Studio 中的代码

我假设这是因为我将指向数组的指针放入sort()(代码的那部分在函数中)?但是我在这里阅读了很多关于如何对数组的指针进行排序的问题并且真的被卡住了。请有人以一种让初学者容易理解的方式解释为什么我的代码不起作用,以及如何修复它?

更新

struct Phones {
    char surname[50];
    int yearWhenPhoneRegistred;
    int phoneNumber;
};
Phones group[20];

void findDataByYear(struct Phones group[], int year, char *arr[]);

int main {
    int year = 0;
    char* surnameArr[20] = {};
    cout <<"Please, type the year value to apply the sorting: \n";
    cin >> year;
    findDataByYear(group, year, surnameArr);
    return 0;
}

void findDataByYear(struct Phones group[], int year, char *arr[]) {
    int j = 0;
    for (int i = 0; i < 20; i++) {
        if (group[i].yearWhenPhoneRegistred > year) {
            arr[j] = group[i].surname;
            j++;
        }
    }

    std::sort(arr, arr + j);
    printf("      Surname      |\n-------------------\n");
    for (int i = 0; i < j; i++) {
        cout << arr[i] << "\n";
    }
}

标签: c++arrayssorting

解决方案


基本问题是,与您的问题的标题相反,您不是要对char[]数组(字符数组)进行排序,而是要对char*[]数组(指针数组)进行排序。所以,默认的排序器(如果你使用std::sort()没有第三个仿函数参数,你会得到什么)只会比较指针本身并按内存顺序对它们进行排序,而不考虑它们指向的字符。

如果要按词法顺序排序,则需要比较字符串:

std::sort(arr, arr+j, [](char *a, char *b)->bool { return strcmp(a, b) < 0; });

推荐阅读