如何检查整数范围?

新手上路,请多包涵

我有这个代码,但是当我输入一个超过整数值的值时它会打印垃圾。我实际上有 if 条件来检查范围。如何让它发挥作用?我知道这对你来说很容易。我只是在 C++ 中忘记了一些东西,我没有时间。

 #include <iostream>
#include <typeinfo>
#include<cfloat>
#include<climits>

using namespace std;

int    g1, g2;
string text  = " year";
string text2 = " age";

int main() {
  g1 = 2100000000000000000000000;
  g2 = 16;

  if (g1 < INT_MIN || g1 > INT_MAX) {
    std::cout << "Please enter an integer";
  } else {
    std::cout << g1 << text;
    std::cout << g2 << text2;
  }

  return 0;
}

原文由 Самат Арыстанов 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 443
1 个回答

因为 C++ 故意模糊了原始类型(如 — )的最小和最大大小,所以像 int 2100000000000000000000000 的大整数文字很危险地依赖于平台。

您的程序甚至可能是格式错误的,因此根本无法编译。幸运的是,检查用户输入与整数文字没有任何关系。前者发生在 运行时,后者是 编译时 方面。

这意味着您的示例代码是一个不切实际的场景。在实际程序中, g1 的值 不会 是编译时常数,而是用户输入的数字。

一个非常好的做法是先让用户将数字输入到 std::stringstd::getline ,然后使用 std::stoi 将字符串转换为 int

如果您遵循这种做法,所有错误检查都由标准库执行,您不必使用 INT_MININT_MAX 或它们的 C++ 对应物 std::numeric_limits<int>::min()std::numeric_limits<int>::max() 完全没有。

例子:

 #include <iostream>
#include <string>

auto const text  = " year";
auto const text2 = " age";

int main() {
  try {
    std::string input;

    std::getline(std::cin, input);
    auto const g1 = std::stoi(input);

    std::getline(std::cin, input);
    auto const g2 = std::stoi(input);

    std::cout << g1 << text;
    std::cout << g2 << text2;
    std::cout << '\n';

  } catch (std::out_of_range const&) {
    std::cout << "Please enter an integer\n";
  }
}

很棒的是,这也将检测到 其他 类型的错误用户输入,例如当用户输入字母而不是数字时。在这段示例代码中扩展错误处理以捕获其他类型的异常作为练习留给读者。

原文由 Christian Hackl 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题