当我尝试比较c ++中的两个字符串时,程序崩溃了?

时间:2011-12-07 01:53:04

标签: c++ string function crash compare

int removeContact(Contact *newPtr, int runningTotal)
{
    //define variables
    string remove;
    int next;

    //prompt user for name they wish to remove
    cout << "Enter the name you would like to delete (Last name first): ";
    cin.ignore();
    getline(cin, remove);

    for (int t=0; t<=runningTotal; t++)
    {   
        if (remove.compare(newPtr[t].name) == 0)  
        {

            //calls function moveArrayElements function
            moveArrayElements(newPtr, runningTotal, t);

            //decrement runningTotal
            runningTotal--;

            //prompt user contact was found
            cout << "Contact was found and deleted!";

            next=1;
        }   

}

if(next!=1)
{
   cout<< "ERROR: Contact was not found!"; 
}

return runningTotal;
}

此功能是用于管理人员联系信息的较大c ++程序的一部分。此功能可以删除联系人。

我遇到的问题是if (remove.compare(newPtr[t].name) == 0)语句。当我的程序到达代码的这一部分时,它将崩溃而不会出现任何错误。我试着用==运算符直接比较这两种情况,但这仍然会导致程序崩溃...

此外,令人如此奇怪的是,当我的程序运行时,我正在尝试删除未存储在文本文件中的联系人时,此代码可以正常工作。

然而,当我关闭我的程序,并从文本文件加载我的联系信息时,我的程序将崩溃...我知道我的程序正在将文件读入正确的字符串数组,因为我有一个打印功能,所以我知道我的所有联系人都被转移到正确的结构阵列......

关于如何解决此问题的任何想法?任何帮助,将不胜感激!感谢

更新:我在评论中提出了建议,并将我的for循环更改为

t<runningTotal;

然而,当我这样做时,我的程序不会崩溃,但它不会比较字符串......

2 个答案:

答案 0 :(得分:2)

如果runningTotal是数组的大小,则有效元素的范围为[0, runningTotal)。在下面的代码中,当您在那里没有有效的runningTotal对象时,您将循环到Contact 包含

for (int t=0; t<=runningTotal; t++)
{   
    if (remove.compare(newPtr[t].name) == 0)

因此,当您去取消引用newPtr[t]时,对于t = runningTotal然后尝试获取name元素,您将导致未定义的行为并可能导致崩溃。

尝试将t<=runningTotal更改为t < runningTotal以查看问题是否消失。

此外,您是否有理由使用数组而不是std::vector

答案 1 :(得分:1)

我想for语句应该是:

for (int t=0; t<runningTotal; t++)