2013-03-03 46 views
0

我想知道是否有任何停止字母输入一个整数。这里是我在我的int main中使用的代码。你可以停止输入一个整数的字母吗?

do 
{ 
    cout << "Player 1 please enter the value of the row you would like to take "; 
    cin >> row; 
}while (row != 0 && row != 1 && row != 2 && row != 3); 

这个代码的问题是,如果用户输入一个字母,它会创建一个永无止境的循环。任何帮助将非常感激。

+0

这个作业是否有像“只使用我们已经学过的标准C++东西”的约束?如果这是更“真实的”,那么有很多选择,这取决于操作系统和许可问题。 – hyde 2013-03-03 11:27:23

回答

4

标准库不提供任何可以过滤通过标准输入输入的字符的内容。我相信你可以使用像curses这样的库来做到这一点。

但是你可以做的是检查输入是否成功。 operator>>int将流的状态设置为failbit,如果它不能为一个整数(例如,当它遇到'a'或类似的东西,你可以用提取运营商在布尔上下文中,这样的事情:

cout << "Player 1 please enter the value of the row you would like to take "; 

while (!(cin >> row) || (row < 0 || row > 3)) { 

    cout << "Invalid input, try again!\n"; 
    // clear the error flags and discard the contents, 
    // so we can try again 
    cin.clear(); 
    cin.ignore(std:numeric_limits<std::streamsize>::max(), '\n'); 
} 

请注意,如果您例如1abc输入,读取将succesfuly阅读1和流中离开abc,这可能不是一个期望的行为。如果你希望把它看成一个错误,你可以说

if ((cin >> std::ws).peek() != EOF) { /* there's more input waiting */ } 

并采取相应的行动,或者只有在您有价值时,无条件地忽略流中的所有内容。

1

一次只获取一个字符,并且只将数字字符添加到字符串中。使用

cin.get(); 

在循环中。

+0

这有问题,默认输入是基于行的。这意味着,即使输入第一个字符用户,getchar也不会返回,直到用户输入整行并按回车。 – hyde 2013-03-03 11:14:20

+0

如果你甚至不想看到这个角色,那么你就必须用Windows来降低你可以使用的CWnd :: OnKeyDown – QuentinUK 2013-03-03 11:19:07

相关问题