2012-08-05 332 views
0

下面是C++中简单菜单的代码。出于某种原因,如果您给它垃圾输入,它会正确反应(“请再次尝试您的选择”)。然而,它会再次通过循环再次发出错误消息,然后最终恢复正常运行。在C++中重复循环

编辑

输入变量是char。如果垃圾输入只有一个字符长度,那么该循环就像它应该的那样工作。如果在用户被允许再次输入任何内容之前有任何额外的字符会导致循环被执行超过一次。

char input = 0; 
    while (input != 4) 
{ 
    cout << "1. Circle"; 
    cout << "\n2. Rectangle"; 
    cout << "\n3. Triangle"; 
    cout << "\n4. Quit"; 
    cout << "\nChoose a shape: "; 
    cin >> input; 

    switch(input) 
    { 
    case '1': 
     circleFunctions(); 
     break; 
    case '2': 
     rectangleFunctions(); 
     break; 
    case '3':   
     triangleFunctions(); 
     break; 
    case '4': 
     exit(4); 
    default: 
     cout << "\nPlease try your selection again...\n"; 
     input = NULL; 
     cin.ignore(); 
     break; 
    } 

    cin.ignore(); 
    cout << "\n"; 
} 
+0

看到这个常见问题:为什么我的程序进入一个无限循环当有人进入非法字符?(HTTP://www.parashift。 com/C++ - faq/stream-input-failure.html) - 你使用'ignore'错误而不是调用'clear'。 – ildjarn 2012-08-05 00:14:56

+0

我会假设输入是一个int。你问什么? – 2012-08-05 00:15:20

+1

正如Xero所回答的那样,std :: cin.clear()应该修复它,但是要注意你的输入类型,它看起来像你将它比作while语句中的一个数字,但在case语句中它是一个char 。 – SMK 2012-08-05 00:23:55

回答

0

找到了答案。添加下列参数cin.ignore使工作:

cin.ignore(20, '\n'); 
1

您只需要在遇到默认情况下,当清除输入缓冲器,

std::cin.clear(); 

之后忽略输入流中的一切,

std::cin.ignore(INT_MAX); 

这将会使CIN缓冲区处于良好状态,并且提取操作符(>>)应该正常工作。

+0

有趣..如果垃圾输入只有一个字符长,程序运行良好。如果有任何其他字符使程序循环两次。 – NealR 2012-08-05 00:27:34

+0

将你的cin.ignore()改为cin.ignore(INT_MAX);我不在Linux上,所以无法测试,但您应该能够解决这些问题。 – Akshet 2012-08-05 00:29:21

+0

由于某种原因导致程序崩溃。您将收到错误消息“请再次尝试您的代码”,然后一无所获。 – NealR 2012-08-05 00:32:46