我有class
名为ContactInfo
,结构如下:
class ContactInfo
{
private:
string contactName;
string contactNumber;
public:
ContactInfo()
{
contactName = "";
contactNumber = "";
}
//setter and getters
};
我有一个创建ContactInfo
数组的函数,并通过用户输入填充它。填充数组后,它将被传递给另一个对它进行排序的函数,所述函数编写如下所示。
void sortListByName(ContactInfo contactList[], int listSize)
{
for(int i = 0; i < listSize; i++)
{
for(int j = i+1; j < listSize+1; j++)
{
if(contactList[i].getContactName() > contactList[j].getContactName())
{
ContactInfo temp = contactList[j];
contactList[i] = contactList[j];
contactList[j] = temp;
}
}
}
}
主要方法
int main()
{
...
int n;//array size
ContactInfo *newList = contactList(n);//populates the array.
sortListByName(newList, n);
...
}
问题是程序会在排序发生之前终止并产生错误:
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
答案 0 :(得分:3)
您的错误是在最后一次迭代中的排序算法中产生的。 问题是,在第一个for循环变量i中从0变为listSize, 在第二个for循环变量j从i + 1变为listSize + 1。当变量i到达listSize-1时,变量j将从第二个for循环中的i + 1开始。这意味着j = listSize,然后当您尝试访问contactList [j]时,将发生错误,因为contactList的元素从索引0开始并以索引listSize-1结束。
void sortListByName(ContactInfo contactList[], int listSize)
{
for(int i = 0; i < listSize; i++) //it should be for(int i=0;i<listSize-1;i++)
{
//here is your mistake. When i = listSize-1 then j=listSize and
// that index is out of range.
for(int j = i+1; j < listSize+1; j++) //it should be for(int j=i+1;j<listSize;j++)
{
if(contactList[i].getContactName() > contactList[j].getContactName())
{
ContactInfo temp = contactList[j];
contactList[i] = contactList[j];
contactList[j] = temp;
}
}
}
}
这就是你的代码的样子:
void sortListByName(ContactInfo contactList[], int listSize)
{
for(int i = 0; i < listSize-1; i++)
{
for(int j = i+1; j < listSize; j++)
{
if(contactList[i].getContactName()> contactList[j].getContactName())
{
ContactInfo temp = contactList[j];
contactList[i] = contactList[j];
contactList[j] = temp;
}
}
}