【问题标题】:do while loop ignores my bool flag variable c++做while循环忽略我的布尔标志变量c ++
【发布时间】:2017-03-30 12:47:43
【问题描述】:

如果 userList[i].CheckUser(username, password) 返回 false 然后它进入 else 条件,我得到输出“用户不存在!再试一次输入用户名和密码”,然后该行陷入无限循环我不知道为什么,我的意思是程序再次重新进入 do-while 循环,所以我看不到循环将如何继续?

int main()
{   
    LoadUsersFromDatabase();
    bool flag;
    string username;
    int password;
do{
    cout << "Enter username and password: ";
    cin >> username >> password;
    for (int i = 0; i < numOfUsers; i++)
        if (userList[i].CheckUser(username, password) == true)
        {
            if (userList[i].GetUserType() == 'A')
            {
                ProcessAssistantMenu();
            }
            else if (userList[i].GetUserType() == 'M')
            {
                ProcessManagerMenu();
            }
        }
        else
                cout << "\rUser Does Not Exist! Try Again! ";
                flag = false;
  } while(flag == false);
return 0;
}

【问题讨论】:

  • 未初始化的局部变量将具有 indeterminate 值。在 C++ 中使用未初始化的局部变量将导致未定义的行为。幸运的是,您的 flag 变量从未未初始化,因为您始终无条件地将其设置为 false
  • @mch:我刚刚回滚了您的编辑 - 糟糕的格式(以及缺少大括号)实际上是用户代码问题的一部分,因此修复它会掩盖解决方案。
  • @Dean:请不要即时修复您的代码 - 它会使现有答案无效,并且会让未来的读者感到困惑。
  • 对不起,我把它改回来了,问题是我添加了大括号并将标志变量设置为true,但仍然有同样的错误
  • 我刚刚注意到的另一件事:你在哪里设置numOfUsers

标签: c++ infinite-loop do-while


【解决方案1】:

你总是在设置你的flag = false

我猜你想这样做:

else{
    cout << "\rUser Does Not Exist! Try Again! ";
    flag = false;
}

正如 Alex 指出的那样,您一开始并没有设置 true

【讨论】:

  • 是的,因为如果 .checkUser 上的返回为真并且它进入 ProcessAssistantMenu() 或 ProcessManagerMenu() 在函数中都有一个 exit(1),那么它只是糟糕的编程和约定但是它已通过将标志初始化为 true 来纠正,但修复大括号和初始化标志似乎并没有解决我的问题,我不知道无限循环来自哪里
【解决方案2】:

标志永远不会在循环中设置true

【讨论】:

  • 更重要的是,它永远不会设置为true在循环中!
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2011-08-01
  • 2013-08-04
相关资源
最近更新 更多