【发布时间】:2013-05-24 02:06:30
【问题描述】:
我正在为 C++ 类开发游戏“Hex”,但无法理解如何确保 cin 读取正确的类型。我做了一些研究,我已经接近了,但这是我的问题:
int i, j;
while(true){
cin >> i;
if(cin.fail() ){ //if type wasn't right
cin.clear(); //clear stream
cin.ignore(); //ignore left over data
cout << "First value is invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
cin >> j;
if(cin.fail() ){ //if type wasn't right
cin.clear(); //clear stream
cin.ignore(); //ignore left over data
cout << "Second value is invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
if(i < 0 or i >= size or j < 0 or j >= size){
//prompt that input is wrong
cout << "Invalid input! Valid coordinates are in range 0 to " << size - 1 << endl;
continue;
}
那里有中断语句,它确实可以正常运行。我的问题是这样的运行:
Player 1's turn
Enter the row and column coordinate with only a space inbetween
a b
First value is invalid input! Valid coordinates are in range 0 to 10
First value is invalid input! Valid coordinates are in range 0 to 10
u 8
First value is invalid input! Valid coordinates are in range 0 to 10
8 u
当第二个值都不正确时,它不会检测到第二个值不正确,当只有第二个值不正确时,它不会将其检测为错误。我看过http://www.cplusplus.com/reference/iostream/cin/?kw=cin,它甚至没有失败、清除和忽略函数的文档,所以我不完全理解它们。提前致谢!
【问题讨论】:
-
您忽略了单个字符并重新启动循环,因此在出现任何错误后您将返回“第一个”值。
cin >>一次处理一个以空格分隔的单词,换行符只是另一个空格字符。 -
文档不存在,因为这些是
std::istream类的方法,其中cin是一个实例。试试这个链接:cplusplus.com/reference/istream/istream. -
但是我自己写了测试代码,发现可以检测到第二个。如果
while()被爆出,请检查您的代码。int z; int s; std::cin >> z; if(std::cin.fail()) { printf("first cin is failed!\n"); } std::cin >> s; if(std::cin.fail()) { printf("second cin is failed!\n"); }@user2309865 -
顺便说一句,如果您想避免出现第二行
First value is invalid input! Valid coordinates are in range 0 to 10,您可能需要使用cin.ignore(numeric_limits<streamsize>::max(), '\n');而不是cin.ignore();。这将在第一次失败后忽略cin输入流中的其余行。这可能更优雅。不过,您需要包含标题<limits>。