我正在尝试调试一个程序而不太了解正在发生的事情。从用户输入填充书籍数组后,我试图按字母顺序(按书名)订购指向书籍对象的指针数组。运行程序会导致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;
}
编辑:固定循环
答案 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(),而不是滚动自己的排序函数。