检查函数进入无限循环和分段错误
Check function going into infinite loop and segmentation fault
void InputStatisticalData()
{
//variables declaration
cout << "\n[Here to take in data]" << endl;
//cin data
while (exit == false)
{
cout << "Entered Loop" << endl;//for troubleshooting purpose
cout << "CountCheck: " << countcheck << endl;//for troubleshooting purpose
if (!Vector.empty())
{
cout << "Entered Vector check IF" << endl;//for troubleshooting purpose
if (condition)//checks if data has any duplicates
{
cout << "\nData already exist, please enter a new set of data." << endl;
break;
}
else
{
cout << "Entered countcheck++" << endl;//for troubleshooting purpose
countcheck++;
}
}
else
{
//stores data
exit = true;
}
}
}
大家好,上面是我的函数,它接收一些数据并将它们存储到一个对象中,然后再存储到一个向量中。一切正常,因此我决定对该功能进行一些验证检查。其中1是检查输入的数据是否已经输入过。
我可以存储一次数据,仅此而已,一旦我尝试再次存储它,它将进入无限循环并给我一个分段错误。我已经尝试解决了一个星期,但无济于事。
另一个无限循环是cin.fail。如果检测到错误输入,它也会进入无限循环。
感谢您抽出时间来看一看。
大声笑,为什么要对我的问题投反对票,有问题和解决方案,应该可以帮助别人,所以停止投反对票并投赞成票
您正在处理一个无限循环,因为在您的迭代结束时错误标志没有被重置。
在尝试任何其他操作之前,您应该执行 cin.clear() 以重置故障位:
if(cin.fail())
{
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input
...
}
在你的第二个循环中,你检查数据向量是否为空。如果它不为空(第二个条目)并且你的数据是新的,它将无限期地落在增加countcheck
.
的else语句中
可能会发生两种情况:无限循环或分段错误(越界异常)。
您应该检查上限,例如:
if(countcheck > Vector.size())
{
//This data is new
PTD.setLD(LD);
Vector.push_back (PTD);
cout << "\nRecord stored successfully, returning back to main menu." << endl;
exit = true;
}
else if(Vector[countcheck].getX() == MainX &&
...
}
您也可以使用 for statement
代替:
for(countcheck = 0; countcheck < Vector.size(); countcheck ++)
{
if(Vector[countcheck].getX() == MainX && ...)
{
...
exit = true;
break;
}
}
//New element
if(countercheck == Vector.size())
{
PTD.setLD(LD);
Vector.push_back (PTD);
cout << "\nRecord stored successfully, returning back to main menu." << endl;
exit = true;
}
void InputStatisticalData()
{
//variables declaration
cout << "\n[Here to take in data]" << endl;
//cin data
while (exit == false)
{
cout << "Entered Loop" << endl;//for troubleshooting purpose
cout << "CountCheck: " << countcheck << endl;//for troubleshooting purpose
if (!Vector.empty())
{
cout << "Entered Vector check IF" << endl;//for troubleshooting purpose
if (condition)//checks if data has any duplicates
{
cout << "\nData already exist, please enter a new set of data." << endl;
break;
}
else
{
cout << "Entered countcheck++" << endl;//for troubleshooting purpose
countcheck++;
}
}
else
{
//stores data
exit = true;
}
}
}
大家好,上面是我的函数,它接收一些数据并将它们存储到一个对象中,然后再存储到一个向量中。一切正常,因此我决定对该功能进行一些验证检查。其中1是检查输入的数据是否已经输入过。
我可以存储一次数据,仅此而已,一旦我尝试再次存储它,它将进入无限循环并给我一个分段错误。我已经尝试解决了一个星期,但无济于事。
另一个无限循环是cin.fail。如果检测到错误输入,它也会进入无限循环。
感谢您抽出时间来看一看。
大声笑,为什么要对我的问题投反对票,有问题和解决方案,应该可以帮助别人,所以停止投反对票并投赞成票
您正在处理一个无限循环,因为在您的迭代结束时错误标志没有被重置。
在尝试任何其他操作之前,您应该执行 cin.clear() 以重置故障位:
if(cin.fail())
{
cin.clear();
cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); //skip bad input
...
}
在你的第二个循环中,你检查数据向量是否为空。如果它不为空(第二个条目)并且你的数据是新的,它将无限期地落在增加countcheck
.
可能会发生两种情况:无限循环或分段错误(越界异常)。
您应该检查上限,例如:
if(countcheck > Vector.size())
{
//This data is new
PTD.setLD(LD);
Vector.push_back (PTD);
cout << "\nRecord stored successfully, returning back to main menu." << endl;
exit = true;
}
else if(Vector[countcheck].getX() == MainX &&
...
}
您也可以使用 for statement
代替:
for(countcheck = 0; countcheck < Vector.size(); countcheck ++)
{
if(Vector[countcheck].getX() == MainX && ...)
{
...
exit = true;
break;
}
}
//New element
if(countercheck == Vector.size())
{
PTD.setLD(LD);
Vector.push_back (PTD);
cout << "\nRecord stored successfully, returning back to main menu." << endl;
exit = true;
}