检查函数进入无限循环和分段错误

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;
}