【问题标题】:Warn user about incorrect int input警告用户不正确的 int 输入
【发布时间】:2023-03-14 16:17:01
【问题描述】:

我的程序包含一个简单的输入代码:

int number;
std::cin >> number;

当然,如果用户键入 3.14,则只会读取“3”。一般情况下,这对于进一步的代码是可以的,但我希望将这种输入标记为无效并提示用户使用正确的整数重试。

有没有办法检查 int 之后是否输入了任何内容?

【问题讨论】:

  • 你谷歌了吗?您可以测试您的读取操作的返回值,例如:cplusplus.com/forum/beginner/21595
  • if (!(std::cin >> number) || !cin.eof()) 但由于我们谈论的是标准输入,因此并没有真正的“输入结束”。另请注意,我们在一小时前收到了a very similar question
  • C++ 的格式化输入函数对于任何需要严格输入验证的情况都毫无用处。你可以做到,但它变得非常丑陋。我几乎总是最终提取分隔字符串(如带有getline 的行),然后自己解析它们。
  • 您也可以假设该数字是浮点数或双精度数,然后找到该数字的底数/上限。如果它的地板/天花板不等于原来的,那么它就不是一个 int。
  • @5gon12eder,eof 检查是多余的,因为如果!(std::cin >> number) 遇到 EOF,它将为真。无论如何,输入可以被重定向,或者用户可以输入 ctrl-D 或任何变体。

标签: c++ int cin


【解决方案1】:

我建议将输入作为字符串然后解析它。 例如:

string s;
std::cin >> s;

编写一些函数来检查输入。 例如:'0'<=s[i]<='9'

你甚至可以使用正则表达式。

更新: 正如 5gon12eder 所说:你有同样的std::stoi 功能。如果它是有效的整数,它会将字符串转换为 int。否则会抛出异常invalid_argument

【讨论】:

  • 标准库已经有这个功能:std::stoi
  • 同意,但你永远不知道用户要输入什么。 stoi 将字符串转换为 int。但输入可能不是整数。
  • 在这种情况下std::stoi 和朋友会抛出std::invalid_argument,您可以catch 并采取适当的行动。 (注意:stoi != atoi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-09
  • 1970-01-01
  • 2022-11-17
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多