检查功能进入无限循环和分段错误


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

相关内容

  • 没有找到相关文章

最新更新