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

时间:2015-02-24 22:15:31

标签: c++ arrays pointers struct

我正在尝试调试一个程序而不太了解正在发生的事情。从用户输入填充书籍数组后,我试图按字母顺序(按书名)订购指向书籍对象的指针数组。运行程序会导致seg错误,并且调试器向我显示当调用我的orderAlphabetically函数时,指针数组(直到那时完全正常),只包含三个元素。任何想法为什么会这样?

谢谢!

#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;
}

编辑:固定循环

1 个答案:

答案 0 :(得分:1)

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(),而不是滚动自己的排序函数。