c++ thereIsSimilarID函数中的错误导致意外返回值(24)

cu6pst1q  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(166)

我为冗长的代码道歉,但我在C++程序中遇到了一个意想不到的问题。(teamNum)包含向量的类类型在thereIsSimilarID函数中,我的目标是检查teamNum中是否存在满足以下条件的播放器:tName等于_tname(函数参数),pID等于_pID(函数参数)。

bool thereIsSimilarID(string _tname, int _pID)
{
    for (int i = 0; i < teamNum.size(); i++)
    {
        if (teamNum[i].tName == _tname)
        {
            for (int j = 0; j < teamNum[i].player.size(); j++)
            {
                if (teamNum[i].player[j].pID == _pID)
                    return true;
            }
        }
        else if (i == (teamNum.size() - 1))
        {
            return false;
        }
    }
}

字符串
main函数中:

int main()
{
    cout << "\n" << thereIsSimilarID("Leverpool", 1) << endl;
}


意外输出为24,并且仅当球队(“Leverpool”)是teamNum向量中的最后一支球队时才会发生此问题。
我很感激任何关于识别和解决此错误的指导。另外,如果可能的话,请帮助我了解根本原因,以便我可以从解决方案中学习。谢谢您的帮助!

u3r8eeie

u3r8eeie1#

您遇到了未定义的行为。
如果你在最后一个元素上取if (teamNum[i].tName == _tname)-分支,但没有找到具有正确pID的玩家,你不会返回任何东西。这意味着,返回值是当前存储返回值的内存位置中的任何随机值。在你的例子中,它发生在24。但理论上,一切都可能发生。
teamNum为空时也会出现同样的问题。
解决方案是确保总是从函数中返回一个值(当然,除非它具有返回类型void):

bool thereIsSimilarID(string _tname, int _pID)
{
    for (int i = 0; i < teamNum.size(); i++)
    {
        // In this loop return true if you find a matching element
    }

    // If no matching element was found we reach this point and make sure to return a value
    return false;
}

字符串
你应该查看一下你的编译器设置,并启用所有的警告。通常,让它把某些警告当作错误处理是很好的。

相关问题