我想读取一个unsigned int
使用cin
,如下所示:
#include <limits.h> #include <iostream> using namespace std; int main(int argc, char* argv[]) { unsigned int number; // UINT_MAX = 4294967295 cout << "Please enter a number between 0 and " << UINT_MAX << ":" << endl; cin >> number; // Check if the number is a valid unsigned integer if ((number < 0) || ((unsigned int)number > UINT_MAX)) { cout << "Invalid number." << endl; return -1; } return 0; }
但是,只要input的值大于无符号整数( UINT_MAX
)的上限,程序就会显示3435973836
。 如何检查用户给出的input是否在0
到UINT_MAX
之间?
两件事情:
检查无符号整数是否为<0或> UINT_MAX是毫无意义的,因为它永远无法达到该值! 您的编译器可能已经抱怨了一个警告,如“由于有限的类型范围,比较总是错误的”。
我能想到的唯一解决方案是捕获一个字符串中的输入,然后使用老式的strtoul()设置errno以防溢出。
即:
#include <stdlib.h> unsigned long number; std::string numbuf; cin >> numbuf; number = strtoul(numbuf.c_str(), 0, 10); if (ULONG_MAX == number && ERANGE == errno) { std::cerr << "Number too big!" << std::endl; }
注意:strtoul返回一个unsigned long; 没有函数strtou(),返回一个unsigned int。
你的检查是没有意义的(编译器有正确启用的警告会告诉你),因为你的值永远不会低于0,也不会超过UINT_MAX,因为那些是最小和最大值的类型的unsigned int
变量保持。
使用流状态来确定读入整数是否正常工作。
你可以读取一个无符号长整数,并且对照无符号整数限制进行测试。
当用户输入一个高于UINT_MAX
的数字时, cin
UINT_MAX
以UINT_MAX
上限 。 价值也不能是负面的。
如果需要扩展范围,请使用unsigned long long
进行输入,并在检查之后将其转换为unsigned int
。 不过,这并不能防范unsigned long long
范围的数字。
对于通用的解决方案,您可以读取一个string
,并使用unsigned long long
自己完成一个转换。
如果你试图把它读入一个unsigned int
你将不得不限制自己到一个unsigned int
的约束。
最常用的方法是将输入内容读取为string
并对其进行解析以确保它处于正确的范围内。 一旦你验证了它,你可以将它转换为一个unsigned int
。