c++ - 使用 cout/cin 要求有效输入

标签 c++

我有一个游戏,用户需要一次输入一个特定范围内的 x 和 y 坐标。现在我的输入代码如下:

do {
    printf("\n");
    cout << "X: ";
    cin >> x;
    cout << "Y: ";
    cin >> y;
} while (cin.fail());

我是 c++ 的新手,但阅读文档后我相信这是验证用户输入的可接受方法。当输入有效时它工作得很好,但是当输入是不同类型时(例如输入“a”)它会无限循环“X:Y:”。我需要做哪些不同的事情才能让它等待用户输入,就好像这些行是第一次被读取一样?

最佳答案

你应该检查每一个输入操作:

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);
}

这样,如果用户在 session 中间按下 [Ctrl]-D,程序会立即关闭并且不会尝试从已关闭的输入流中读取更多值。

标记为 #1 的行上的条件测试是否成功解析整数以及是否已到达行尾(吞噬中间空格)。

关于c++ - 使用 cout/cin 要求有效输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12397016/

相关文章:

c++ - 如果使用多字节字符集,为什么 TCHAR 值会改变?

c++ - boost::spirit:语义 Action block 中的多个语句

c++ - 未定义对 Arduino C++ 中类函数的引用

c++ - 轮廓不等于轮廓[i]?

c++ - 从命名空间基类虚拟继承,具有来自命名空间的私有(private)成员

c++ - 将 va_arg 传递给函数两次会得到相同的值

c++ - 如何忽略文件底部的空格?

c++ - 提振 spirit assign_to_* 自定义点数

c++ - 您如何从 CComSafeArray 获取底层 SAFEARRAY?

c++11 注册缓存线程安全