指针数组函数参数-奇怪的行为

array of pointers function parameter - odd behaviour

本文关键字:数组 函数 参数 指针      更新时间:2023-10-16

我正在调试一个程序,但不太了解发生了什么。根据用户输入填充图书数组后,我尝试按字母顺序(按书名)排列指向图书对象的指针数组。运行该程序会导致seg错误,调试器向我显示,当调用我的orderAlphabetly函数时,指针数组(在此之前非常好)只包含三个元素。有什么想法吗?

谢谢!

#include <iostream>
#define MAXBKS 20
using namespace std;
typedef struct book{
    float price;
    string name;
    string author;
}book;

// addBooks():  Gather user input and add book structs to array.
// @Params: the main library array, and its size.
// 
void addBooks(book library[], int size){
    string name, author, price;
    for(int i = 0; i< size; ++i){
        cout<< "Enter the name of the book, author, and price, each separated by "~": "; 
        if (cin.peek() == 'n') break;
        getline(cin, name, '~');    
        getline(cin, author, '~');  
        getline(cin, price, '~');   
        library[i].name = name;
        library[i].author = name;
        library[i].price = stod(price);
        cin.get();
    }
}

// orderAlphabetically():   assign pointers to alphabetically ordered book 
//                          titles. 
// @Params: the main library array, and the pointer array to hold the order
// 
void orderAlphabetically(book *library_ptrs[], int size){
    int pos;
    book *temp;
    for (int i = size; i > 1; i--){
        pos = 0;
        for (int j = 0; j < i; ++j){
            if ((library_ptrs[i]->name).compare(library_ptrs[pos]->name) > 0 )
                pos = j;
        }
        temp = library_ptrs[pos];
        library_ptrs[pos] = library_ptrs[i-1];
        library_ptrs[i-1] = temp;
    }
}
void printLibrary(book library[], int size){
    int i = 0;
    while ((library[i].price != 0) && (i < size)){
        cout<< "nBook "<< i+1<< ": "<< endl;
        cout<< library[i].name<< endl;
        cout<< library[i].author<< endl;
        cout<< library[i].price<< endl;
        cout<<endl;
        ++i;
    }
}

int main(){
    book library[MAXBKS] = {0};
    book *library_ptrs[MAXBKS] = {0};
    // Add books to the library until the user enters 'enter'
    addBooks(library, MAXBKS);
    // Print entered books
    cout<< "nThese are the books you have added: "<< endl;
    printLibrary(library, MAXBKS);
    // Order Alphabetically
    for (int i = 0; i < MAXBKS; ++i)
        library_ptrs[i] = library + i;
    orderAlphabetically(library_ptrs, MAXBKS); 
    return 0;
}

编辑:已修复循环

while ((library[i].price != 0) && (i < size)) // i <= size is wrong

if ((library_ptrs[i]->name).compare(library_ptrs[pos]->name) > 0) // i was initialized to size, so similar problem, out of bound.

请查看std::sort(),而不是滚动自己的排序函数。