如何检查整数范围?

11 浏览
0 Comments

如何检查整数范围?

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

#include 
#include 
#include
#include
using namespace std;
int    g1, g2;
string text  = "年";
string text2 = "岁";
int main() {
  g1 = 2100000000000000000000000;
  g2 = 16;
  if (g1 < INT_MIN || g1 > INT_MAX) {
    std::cout << "请输入一个整数";
  } else {
    std::cout << g1 << text;
    std::cout << g2 << text2;
  }
  return 0;
}

0
0 Comments

如何检查整数范围?

在进行这个检查时,你要做的事情确实很困难。就像检查是否将负数保存到无符号整数中一样。一旦保存在那里,信息就会丢失,变量内部存储的信息表示不同,数值就会变得损坏。

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

检查用户输入总是一个棘手的问题,你必须假设用户可能是错误的,可能会犯错,以及他们可能犯的错误方式。它可能会出现边界情况(参见Little Johnny Drop Tables xkcd.com/327)。流对于这个问题确实有错误状态,文档中有关于>>运算符的描述。

0
0 Comments

如何检查整数范围?

因为C++对于诸如int之类的原始类型的最小和最大大小故意模糊不清,所以像2100000000000000000000000这样的大整数文字是危险的平台相关的。

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

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

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

如果您遵循这个做法,所有的错误检查都由标准库执行,您根本不需要使用INT_MIN、INT_MAX或其C++对应物std::numeric_limits::min()和std::numeric_limits::max()。

示例代码如下:

#include

#include

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";

}

}

这个好处是它还会检测到其他类型的错误用户输入,例如当用户输入字母而不是数字时。将这个示例代码的错误处理扩展到捕获其他类型的异常留给读者作为练习。

事实上,我个人会将std::stoi封装在自己的函数中,并使用除异常以外的其他方法来报告错误,因为错误的用户输入并不是真正的异常。也许返回一个std::optional的元组或结构和一个错误代码。

这里有一个很好的例子,以最小的方式获取值,尽管它没有暴露stoi()所使用的机制,stoi()实际上做到了问题所问的(我们可能有一个隐藏的X-Y)。有时候你可能想要创建自己的函数,添加自定义操作或错误处理,或者使用无异常的代码。

0
0 Comments

如何检查整数范围?

在C++中,您应该使用std::numeric_limits(来自)。标题的名称以C开头,表明它是一个旧的C标题,为了兼容性而保留的(以前的limits.h)。您忘记了表达式中的括号,它将被错误地评估。字面量对于int来说太大了。值实际上不能超过边界类型的边界。

要实际(关闭can of worms)检查范围,您需要一个更大的(can of worms)存储空间。考虑以下函数:

int getInt()
{
while (1) //循环直到用户输入有效输入
{
std::cout << "输入一个整数值:";
long long x; //如果我们使用char,cin将假设它是字符
//其他整数类型没问题
std::cin >> x;
if (std::cin.fail()) //前一个提取失败了吗?
{
//是的,那么让我们处理这个故障,否则下一个>>将尝试解析相同的输入
std::cout << "用户输入无效。\n";
std::cin.clear(); //将我们放回“正常”操作模式
std::cin.ignore(std::numeric_limits::max(),'\n'); //并删除错误的输入
}
//从技术上讲,您只可以执行以上部分,但是那样你无法将无效的格式与超出范围区分开来
else if((x > std::numeric_limits::max()) ||
(x < std::numeric_limits::min()))
{
std::cout << "无效的值。\n";
}
else //否则,返回我们好的x
return x;
}
}

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

0