如何检查整数范围?

时间:2017-03-05 09:01:24

标签: c++

我有这个代码,但是当我输入一个超过整数值的值时会打印出来。我实际上有条件来检查范围。如何使它工作?我知道这对你来说很容易。我只是忘记了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;
}

6 个答案:

答案 0 :(得分:4)

由于C ++故意模糊基本类型的最小和最大大小(如int),因此像2100000000000000000000000这样的大整数文字是危险的平台依赖。

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

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

一个很好的做法是首先让用户使用std::string将号码输入std::getline,然后使用std::stoi将字符串转换为int

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

示例:

std::numeric_limits<int>::max()

最棒的是,它还会检测其他种不良用户输入,例如当用户输入字母而不是数字时。扩展这段示例代码中的错误处理以捕获其他类型的异常,留给读者练习。

答案 1 :(得分:3)

在C ++中,你应该使用std :: numeric_limits(来自<limits>)。以C开头的标头<climits>的名称表明它是旧的C标头,左侧是兼容性(前limits.h)。你忘记了表达式中的括号,它将被错误地评估。文字对于int来说太大了。值实际上不能超过绑定类型的边界

http://en.cppreference.com/w/cpp/types/numeric_limits

#include <iostream>
#include <typeinfo>
#include<limits>

long long g1, g2;

int main() 
{
  //...

  if ((g1 > std::numeric_limits<int>::lowest()) 
       || (g1 < std::numeric_limits<int>::max())) 
  {
       //...
  } 

  return 0;
}

如果用户做错了,您必须处理来自cin的输入以重置输入。要实际(关闭蠕虫)检查范围,您需要更大(可以蠕虫)的存储。考虑这个功能:

int  getInt()
{
    while (1) // Loop until user enters a valid input
    {
        std::cout << "Enter an int value: ";
        long long x;  // if we'll use char, cin would assume it is character
        // other integral types are fine
        std::cin >> x;

        if (std::cin.fail()) // has a previous extraction failed?
        {
            // yep, so let's handle the failure, or next >> will try parse same input
            std::cout << "Invalid input from user.\n";
            std::cin.clear(); // put us back in 'normal' operation mode
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); // and remove the bad input
        }
        // Thechnically you may do only the above part, but then you can't distingusih invalid format from out of range
        else if(( x  > std::numeric_limits<int>::max()) ||
            ( x  < std::numeric_limits<int>::min()))
        {
            std::cout << "Invalid value.\n";
        }
        else // nope, so return our good x
            return x;
    }
}

如果istream无法将输入解析为所需类型,则缓冲区的剩余内容将保持不变,直到您清除它或请求将导致成功的操作为止。例如,您可以检查用户是否输入了浮动..或者他是否输入了停止程序的命令。

答案 2 :(得分:1)

您想要做的事情真的很难检查。就像检查是否已将负数保存为无符号整数一样。一旦将其保存在那里,由于存储在该变量内的信息的不同表示,信息将丢失并且值被破坏。

我不确定如果你试图保存一个大于变量空间的值会发生什么,但最好的选择是将它作为字符串加载并用std :: stoi()解析它,这会给你错误如果值超过了int范围。

答案 3 :(得分:0)

如果您的目标是检查输入数字是否在整数范围内?然后您可以将输入数字作为字符串,使用字符串函数可以检查数字是否在范围内。这是一个实现。

input[type=checkbox]:checked+label {}

答案 4 :(得分:0)

只需检查输入是否成功:

#include <iostream>


int main()
{
    int val;
    if (std::cin >> val)
        std::cout << "value is " << val << "\n";
    else
        std::cout << "value input failure\n";

    return 0;
}

Live on Coliru

答案 5 :(得分:-2)

c ++有头文件,对于你正在使用的实现,有不同数据类型的最小值和最大值。

看那边。此外,你必须使用64位整数,看它是否小于那么最大或大于32位整数的最小值,那么你可以转换。