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;
然而,当我这样做时,我的程序不会崩溃,但它不会比较字符串......
答案 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++)