您应该检查每个输入操作:
std::cout << "X: ";
if (!(std::cin >> x)) { /* error */ }
std::cout << "Y: ";
if (!(std::cin >> y)) { /* error */ }
如何处理错误取决于您。你可以提前返回,从循环中中断,抛出异常......这一切都取决于。
请注意,您可以循环直到获得可解析的内容,但如果用户关闭输入流,这很危险。最好逐行阅读并解析:
std::cout << "Please enter an integer X: ";
int x;
bool success = false;
for (std::string line; std::getline(std::cin, line); )
{
std::istringstream iss(line);
if (iss >> x >> std::ws && iss.get() == EOF) // #1
{
success = true;
break;
}
std::cout << "Sorry, please try again: ";
}
if (!success)
{
std::cerr << "Unexpected end of input stream!\n";
std::exit(1);
}
这样,如果用户在会话中间按下 [Ctrl]-D,程序会立即关闭,并且不会尝试从关闭的输入流中读取更多值。
行上的条件标记#1
测试是否成功解析整数以及是否已到达行尾(吞噬中间空白)。