【问题标题】:Checking for valid type input using std::cin (C++)使用 std::cin (C++) 检查有效类型输入
【发布时间】: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 &gt;&gt; 一次处理一个以空格分隔的单词,换行符只是另一个空格字符。
  • 文档不存在,因为这些是std::istream 类的方法,其中cin 是一个实例。试试这个链接:cplusplus.com/reference/istream/istream.
  • 但是我自己写了测试代码,发现可以检测到第二个。如果while() 被爆出,请检查您的代码。int z; int s; std::cin &gt;&gt; z; if(std::cin.fail()) { printf("first cin is failed!\n"); } std::cin &gt;&gt; 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&lt;streamsize&gt;::max(), '\n'); 而不是cin.ignore();。这将在第一次失败后忽略cin 输入流中的其余行。这可能更优雅。不过,您需要包含标题 &lt;limits&gt;

标签: c++ cin


【解决方案1】:
u 8
First value is invalid input! Valid coordinates are in range 0 to 10
8 u

由于cin &gt;&gt; i;u 而失败,循环重复,但只有cin 流中的第一个字符(一个空格)被cin.ignore(); 使用。随着循环再次开始,cin &gt;&gt; i; 使用流中剩余的内容执行,在本例中为8。这意味着在错误消息First value is invalid input! Valid coordinates are in range 0 to 10 之后,程序实际上正在等待cin &gt;&gt; j;。当输入8 u时,它首先读取8并将其值赋给j,表示没有失败。循环结束,u 留在流中。

要解决此问题,请将 cin.ignore(); 更改为 cin.ignore(numeric_limits&lt;streamsize&gt;::max(), '\n');。它不会只忽略下一个字符(在本例中是空格),而是会忽略该行的其余部分,从而有效地重置cin 流。您需要包含 &lt;limits&gt; 标头。

【讨论】:

  • 这正是我所需要的,非常感谢您的解释!
  • 没问题,乐于助人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 2014-06-08
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多