2015-01-13 127 views
-2

我有一个菜单,用户必须在1-5之间输入一个数字,任何时候用户输入一个完美的数值,它将会转到指定的情况或者无效数字,它会进入默认状态,并出现一条错误消息。Switch/Case不间断循环

现在我的问题是,当用户输入一个字母表字母,程序保持循环和循环,它不会停止,每次通过默认。

我试了很多东西!使用if语句检查数字是否为1 < =值< = 5不起作用。如果输入不在这些值之间,我尝试在数字中进行硬编码,但它仍会永远循环。我试着做cim.good(),不知道我是否做得对,但我做到这一点的方式不起作用。我也尝试使用isdigit()函数,但同样的问题,它不起作用...我真的不知道我该做什么。这是我的(简化)。

int menu() 
{ 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    cin >> key; 

    return(key); 
}` 

void main() 
{ 
    Menu: 
      key = menu(); 

      switch(key) 
      { 
      case 1: 
       goto Menu; 
      case 2: 
       goto Menu; 
      case 3: 
       goto Menu; 
      case 4: 
       goto Menu; 
      case 5: 
       break; 
      default: 
       cout << endl << "Invalid entry, please try again" << endl; 
       goto Menu; 
      } 
} 

我删除了箱子里面的东西,使其看起来更好。当我输入密钥时,我不断收到“无效输入,请再试一次”的消息,这就是它所经历的地方。

编辑:好吧,我为'goto'道歉,不知道它皱眉,还在学习!谢谢大家所有的帮助。我会开始删除它们。

+4

'goto'?在C++中?奥利? http://stackoverflow.com/questions/3517726/what-is-wrong-with-using-goto – Jack

+4

避免'goto',除非它使事情更容易理解。提示:这意味着专家可能会在十年内使用它一次,或者...... – Deduplicator

+0

“我试着做cim.good(),不知道我是否做得对,但我做的方式不起作用。”请尽量给出更多细节,下次你做了什么,所以我们可以尝试给你一些关于你的错误的具体提示。 – LiKao

回答

1

而是然后用goto,我建议你使用一个简单的循环do {} while

#include <iostream> 

using namespace std; 

int menu() { 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    cin >> key; 

    return(key); 
} 

int main(int argc, char *argv[]) { 
     int key; 
     do { 
       key = menu(); 
     } while (key < 1 || key > 5); 
     cout << key << endl; 
} 

哪些循环key < 1key > 5

+0

我从来没有见过在main()中使用的参数,argc和argv是做什么的?我不知道goto皱眉,但对我来说,这些简单的goto看起来更整洁,也更容易遵循(可能是因为我没有得到它)​​。但是这个代码是如何工作的? – Maty

+0

@Maty他们与你的案件无关,无论如何都是可选的。许多程序员只是在模板代码片段中使用它,而不管这些参数是否被使用。 –

+0

啊,好的。我会对do {}函数进行研究,看看它是如何工作的。但是这里最后一个问题,没有案例,所以它怎么知道去哪里?还是Elliott刚刚把那部分拿出来了,还有什么东西在里面? – Maty

1

看看来自C++ FAQ lite和this postingthis posting

使用cin.good()进行检查是解决方案的第一部分。如果输入非整数cin.good()将返回false。但是,不正确的输入将保留在缓冲区中。因此,如果您再次遇到cin >> key,它将再次无法读取任何内容。

你必须使用cin.clear()清除状态,然后忽略缓冲区的其余部分(直到行尾)使用cin.ignore(INT_MAX, '\n')

所以你的方法将成为:

int menu() { 
    int key; 
    cout << endl << "--------- Main Menu ----------" << endl; 
    cout << "1: Sort" << endl << "2: Add" << endl; 
    cout << "3: Search" << endl << "4: History" << endl << "5: Exit" << endl; 

    cout << "Please pick one: "; 
    while(cin >> key) { // same as querying cin.good() 
     cout << "Not a number" << endl; 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); 
    } 

    return(key); 
} 
+0

我做了一个测试,我有一个if语句来测试cin.good()是否无效。当我插入一个字符时,我认为它不是(就像你提到的那样),所以我硬编码了那里的关键值(在if语句中),key = 6,应该清除它?或没有? – Maty

+1

@Maty:不确定你的评论是什么意思。请张贴您尝试编辑您的问题的代码。真实的代码给你更好的印象。 – LiKao