【问题标题】:Ignore user input outside of what's to be chosen from忽略要选择的内容之外的用户输入
【发布时间】:2011-06-25 22:22:14
【问题描述】:

我有一个程序,用户必须通过输入数字 1-5 进行选择。我将如何处理可能因他们输入超出这些范围的数字甚至字符而产生的任何错误?

编辑:对不起,我忘了提到这是在 C++ 中

【问题讨论】:

  • 嗯,什么编程语言?
  • 抱歉,我漏掉了那部分。 C++ 是语言。

标签: c++ validation exception-handling input


【解决方案1】:

对此要小心。如果用户输入一个字母,以下将产生一个无限循环:

int main(int argc, char* argv[])
{
  int i=0;
  do {
    std::cout << "Input a number, 1-5: ";
    std::cin >> i;
  } while (i <1 || i > 5);
  return 0;
}

问题是std::cin &gt;&gt; i不会从输入流中删除任何内容,除非它是一个数字。因此,当它循环并再次调用std::cin&gt;&gt;i 时,它读取的内容与之前相同,并且永远不会让用户有机会输入任何有用的内容。

所以更安全的选择是先读取一个字符串,然后检查数字输入:

int main(int argc, char* argv[])
{
  int i=0;
  std::string s;
  do {
    std::cout << "Input a number, 1-5: ";
    std::cin >> s;
    i = atoi(s.c_str());
  } while (i <1 || i > 5);
  return 0;
}

不过,您可能希望使用比 atoi 更安全的东西。

【讨论】:

  • 这样就可以了...谢谢...我会删除我的答案。
  • 将 atoi 包装在 try/catch 中怎么样?
  • @SteveSudit: atoi() 不能(不应该)抛出异常,因为它是一个 C 运行时函数。假设无论如何这是std::atoi()atoi 在非数字字符串的情况下不会做任何有用的事情。请改用strtoul 之类的东西。
  • 您应该检查提取操作符是否也失败了。如果要查看无限循环,请输入 EOF(UN*X 上为 Ctrl+D,Windows 上为 Ctrl+Z)一次。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多