2016-08-12 65 views
2

我试图限制用户只输入'1'或'2'。输入字符时出现无限循环

int ch; 

do 
{ 
    cout<<"Enter: \n"; 
    cin>>ch; 
    switch(ch) 
    { 
    case 1: 
     cout<<"1"; 
     break; 
    case 2: 
     cout<<"2"; 
     break; 
    default: 
     cout<<"Retry\n"; 
    } 
}while(ch != 1 && ch != 2); 

当我输入任何数量大于1或2以外,程序运行通过询问用户重试细,但是当我输入一个字符,程序进入到“重试”和“确认”的无限循环。

回答

3

这是因为当你输入一个非数字字符时,输入操作符不能将其解析为一个整数,而是将字符留在缓冲区中。所以下一次迭代循环会再次读取完全相同的字符。一次又一次等。

克服这个问题,最简单的方法是简单地流问ignore该行的其余部分:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // skip bad input 

还有其他方面也一样,在阅读整个行到一个字符串,把那个字符串转换为输入字符串流,然后读取该流中的整数。虽然有更多的工作。这种方式确实意味着您不必检查std::cin上的输入失败,但必须使用上述方法执行此操作。

你完整的代码可能看起来像

int n; 
do 
{ 
    if (!std::cin >> n) 
    { 
     std::cout << "Only numbers accepted. Please try again.\n"; 
     std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // Skip bad input 
     std::cin.clear(); // Clear error flags 
    } 

    // switch ... 
} while (...);