【问题标题】:Prompt user input until correct C++提示用户输入直到正确的 C++
【发布时间】:2017-01-06 03:13:02
【问题描述】:

我正在尝试编写一个代码来提示用户从 cin 输入。

int main()
{
    int year;
    cout << "Enter a valid year: ";
    cin >> year;

    while (cin.fail())
    {
        cout << "Re-enter a valid value! ";
    }
}

但是,当我输入非整数类型时,编译器会不断打印“重新输入有效值!”行。我不知道我的代码有什么问题!有人可以纠正吗?非常感谢。

【问题讨论】:

  • 这么多问题......为什么“编译器打印”任何东西?这不是编译器所做的。为什么要“输入一个有效的年”?为什么不直接“进入一年”?你什么时候需要指定你想要的东西有效
  • @KerrekSB:很抱歉我对术语缺乏了解,但您能指定我的代码中需要更改的内容吗?
  • 这看起来像是重复的:stackoverflow.com/questions/5655142/…

标签: c++ input


【解决方案1】:

试试这个:

bool done = false;
int year;

for (std::string line;
     std::cout << "Enter a year: " && std::getline(std::cin, line); )
{
    std::istringstream iss(line);
    if (iss >> year >> std::ws && iss.get() == EOF) { done = true; break; }
    std::cerr << "Failed to parse input '" << line << "', please try again.\n";
}

if (!done) { std::cerr << "Premature end of input.\n"; }
else       { std::cout << "Input: " << year << "\n";   }

【讨论】:

  • 你让我开心。最后有人对 cin 进行正确的输入处理;)。我也为 bffaf01 感到难过,因为他可能不会从你的代码中理解任何事情。
  • @Logman 没有额外流的更典型的istream::clear()istream::ignore() 方法有什么问题?
  • 我知道这是一个命令行而不是数据库或网站,但不是:'" &lt;&lt; line &lt;&lt; "' 未过滤的 I/O?也许我一直在编写 Web 应用程序并担心跨站脚本编写时间过长?
  • @ebyrob 我把这个答案当作一个小玩笑。答案在各个方面都是正确的,它确实制作精良,但对于不知道为什么while (cin.fail()) 不起作用的人来说太复杂了。
  • @ebyrob 这不像我们在做“select * from”
【解决方案2】:

这是我的方法:

int main() {
    int year;

    while (true) {
        cout << "Enter a valid year: ";
        cin >> year;
        if (cin.fail()) {
            cin.clear(); cin.ignore();
            cout << "Re-enter a valid value! " << endl;
        } else break;
    }
    return 0;
}

【讨论】:

  • 我似乎记得if(cin)if(!cin) 在某种程度上优于ios::good()ios::bad()ios::fail(),但在所有情况下都可能是cin.fail() == !cin,我只是一直忘记这一点。
  • 请注意,此代码为accepts xyz1234abc as valid input。我不知道这种行为是否比其他行为更可取,但值得指出差异。
【解决方案3】:

你描述的问题在这里:

while (cin.fail())
{
    cout << "Re-enter a valid value! ";
}

看来你还没有完全理解这里发生了什么,所以我会为你分解一下。

代码翻译成这样:

"当cin.fail()为真时,输出"重新输入一个有效值! “到控制台”

因为没有办法跳出循环,所以它会一直这样做。

我不认为 cin.fail() 是你想在这里使用的,看起来你想要一个算法来告诉你日期是否有效,如果它无效,重复查询到用户,以便他们可以输入良好的数据。从概念上讲,这是一个很好的做法,您走在正确的轨道上,但您需要学习更多。

我建议阅读一些有关输入/输出的教程,并研究输入验证。

这是学习 C++ 的绝佳资源http://www.cplusplus.com/doc/tutorial/

这里有一些关于输入验证的信息http://www.cplusplus.com/forum/beginner/121194/

【讨论】:

  • 输入验证只是故事的一半。如果您尝试直接从cin 格式化输入,您还需要重置流对象的错误状态。
猜你喜欢
  • 2011-07-17
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多