【问题标题】:string subscript out of range - string bubble sort字符串下标超出范围 - 字符串冒泡排序
【发布时间】:2019-03-22 02:44:39
【问题描述】:

第一次在这里发帖,但我一直在寻找解决此错误的方法。 我收到错误“字符串下标超出范围”

PhoneBook 是一个类 Contact 对象指针的数组。

static const int maxSize = 10;
Contact* phoneBook[maxSize]; //array of contact pointers

Contact 定义为

class Contact
{
public:
    Contact();

    std::string firstName;
    std::string lastName;
    std::string name; //lName + fName
    std::string phoneNumber;
    std::string address;
};

这是我的冒泡排序函数。

void AddressBook::bubbleSort(Contact phoneBook[], int length)
{
Contact temp; 

for (int i = 0; i < length; i++)//for n-1 passes
{
    for (int j = 0; j < length - 1; j++)
    {
        if (phoneBook->name[j] > phoneBook->name[j + 1])
        {
            temp = phoneBook[j];
            phoneBook[j] = phoneBook[j + 1];
            phoneBook[j + 1] = temp;
            }

        }
    }
}

这里是添加联系人

void AddressBook::addContact(std::string fName, std::string lName, std::string pNumber, std::string addr) 
{
    if (isFull())
    {
        std::cout << "Is full" << std::endl;
        return;
    }

    Contact *contact = new Contact;

    contact->firstName = fName;
    contact->lastName = lName;
    contact->name = lName + ", " + fName;
    contact->phoneNumber = pNumber;
    contact->address = addr;

    std::cout << contact->name + " has been added!" << std::endl;
    phoneBook[length] = contact;
    length++; 

    bubbleSort(phoneBook[maxSize], length);

}

最后,我在哪里使用它(source.cpp)

switch (choice) 
{
case 1:
    addrBook.addContact("Ty", "Le", "6191231234", "1234 State Street");
    addrBook.addContact("Zak", "Zachary", "6191231234", "1234 Avenue Drive");

我知道问题来自于 bubbleSort 函数,因为当我从 addContact() 注释它时它会正常工作。

这是我的错误的图片 (too long to copy and paste)

完整代码

.h https://pastebin.com/TrtQW8Tc

.cpp https://pastebin.com/EaGBUe9e

来源 https://pastebin.com/1BR5pXZE

【问题讨论】:

    标签: c++ arrays bubble-sort


    【解决方案1】:

    这几乎是一个错字。而不是在

    中索引name 字符串
        if (phoneBook->name[j] > phoneBook->name[j + 1])
    

    你想索引phonebook

        if (phoneBook[j].name > phoneBook[j + 1].name)
    

    【讨论】:

    • 射击.. 这么近。谢谢!不过,我确实收到了另一个错误,这一次,抛出未处理的异常:读取访问冲突。 _Right_data 为 0xCCCCCD04。 (错误和气泡排序在帖子中更新)
    • @TylerLe 0xCCCCCD04 看起来很像未初始化的内存(请参阅Wikipedia's list of common debugging codes)加上结构中成员变量的偏移量。很可能你在某个地方跑出了堆栈的末尾并试图访问一个指针。
    • 我刚刚查看了您对该问题的编辑,我将在几秒钟内将其回滚。以使现有答案无效的方式更改问题是不好的形式。当一个解决方案暴露了一个新问题时,你最好调试一段时间看看你能不能解决它,如果不能解决,就问一个新问题。
    • 哦,对不起,我不知道。
    • 不用担心。在我完成我的想法之前分心了。您的新错误使程序在 std::string 内的某个地方崩溃。 std::string 中出现错误的几率非常接近于零,因为每天都有大量使用它的人没有问题。如果您向下看 Visual Studio 的底部,您会发现一个调用堆栈选项卡。单击它,您将看到程序如何到达崩溃现场。回到原点,直到找到 0xCCCCCCCC 的来源。然后你可能需要做更多的工作来找出它是如何到达那里的。可能是越界数组访问。
    猜你喜欢
    • 2015-03-31
    • 2013-04-22
    • 2012-04-27
    • 1970-01-01
    • 2018-02-25
    • 2021-01-13
    • 2016-12-02
    • 1970-01-01
    相关资源
    最近更新 更多