C++ 指针排序数组

C++ 指针排序数组,c++,arrays,sorting,c-strings,C++,Arrays,Sorting,C Strings,我试图对指针数组进行排序,这些指针指向名称的字符数组。我可以让程序对前两个名字进行排序,但不能对其余的名字进行排序。此外,名称也是结构的一部分 void sort( Class* ptrs[], int num_classes){ bool swap=false; do { swap=false; for (int i=0; i<=num_classes-1; i++) { if (ptrs[i]->

我试图对指针数组进行排序,这些指针指向名称的字符数组。我可以让程序对前两个名字进行排序,但不能对其余的名字进行排序。此外,名称也是结构的一部分

void sort( Class* ptrs[], int num_classes){
    bool swap=false;

    do
    {
        swap=false;
        for (int i=0; i<=num_classes-1; i++) {

            if (ptrs[i]->title[i]>ptrs[i+1]->title[i]) {
                Swap(&ptrs[i], &ptrs[i+1]);
                swap=true;
            }
        }
    }while(swap);
}

void Swap(Class** num1,Class** num2){

    Class* temp=*num1;
    *num1=*num2;
    *num2=temp;
}

struct Class{
    char title[MAX];
    int units;
    char grade;
};

int main(){
    int choice,num_classes=0;
    char class_selection[MAX];
    Class* ptrs[MAX];
    char* class_ptr[MAX];
    bool Continue=false;
    Class classes[MAX];

    for (int i = 0; i < MAX; i++){
        ptrs[i]=&classes[i];
    }


    cout<<" 1. Add new class"<<endl<<" 2. Edit an existing class"<<endl<<" 3. Display a class"<<endl<<" 4. List all classes"<<endl<<" 5. Display GPA"<<endl<<" 6. Delete all classes"<<endl<<" 7. Quit"<<endl<<"Enter selection number: ";

    cin>>choice;
    if (choice!=7) {
        Continue=true;
    }
    switch (choice) {
        case 1:
            add(ptrs,num_classes);
            num_classes++;
            break;

        case 2:
            edit(ptrs,num_classes);
            cin.ignore();
            break;
        case 3:
            sort(ptrs,num_classes);
            cin.ignore();
            cout<<"Enter the name of the class to display: ";
            cin.getline(class_selection, MAX);
            for (int j =0; j<MAX; j++) {
                class_ptr[j]=&class_selection[j];
            }
            Bin_search(ptrs,num_classes,class_ptr);

            break;
        case 4:
            sort(ptrs,num_classes);
            display(ptrs,num_classes);
            break;
        case 5:
            //     display_GPA();
            break;
        case 6:
            //  delete_end();
            break;
    }
    if (choice == 7) {
        //  delete_end();
        //system('pause");
        return 0;
    }
}
void排序(类*ptrs[],整数类){
布尔交换=假;
做
{
交换=假;
对于(int i=0;ititle[i]>ptrs[i+1]->title[i]){
掉期(&PTR[i]、&PTR[i+1]);
swap=true;
}
}
}while(swap);
}
无效掉期(类别**num1,类别**num2){
类别*temp=*num1;
*num1=*num2;
*num2=温度;
}
结构类{
字符标题[MAX];
整数单位;
煤焦品位;
};
int main(){
int选项,num_类=0;
字符类_选择[MAX];
类别*ptrs[MAX];
字符*class_ptr[MAX];
bool Continue=false;
类别[最大值];
对于(int i=0;icout此代码比较的是相应标题的第个字符,而不是整个标题:

if (ptrs[i]->title[i]>ptrs[i+1]->title[i]) {
//                ^^^                 ^^^
可能的解决办法:

  • 改变这个

    char title[MAX];
    

    然后你就可以写作了

    if (ptrs[i]->title > ptrs[i+1]->title) {
    
  • 只有在由于某种原因不能使用std::string时,才可以使用strcmp
  • if (strcmp(ptrs[i]->title, ptrs[i+1]->title) > 0) {
    

    请添加main(),错误是什么/在哪里通过使用
    std::vector
    简化您的生活。您可以使用
    std::sort
    函数。对于冒泡排序,您应该循环直到容器被排序,而不是按容器中的项目数排序……这是家庭作业问题吗。。。(我想到的唯一原因是为什么要在数组上使用冒泡排序。)无论如何,按照Thomas的建议,使用向量和排序。不幸的是,我不知道如何使用向量,是的,这是一个家庭作业问题。
    if (strcmp(ptrs[i]->title, ptrs[i+1]->title) > 0) {