2012-03-05 75 views
6

我试图用unsigned intcin如下阅读:读“无符号整型”使用“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; 
} 

但是,每当我进入比无符号整数(UINT_MAX)的上限的值,该程序显示3435973836。如何检查用户给出的输入是否在0UINT_MAX之间?

+12

'如果((数<0)||((无符号整数)数> UINT_MAX))'我不能甚至描述如何误导,这是。 – ildjarn 2012-03-05 22:09:08

+0

也许从更简单的东西开始,绝对是一本好书。 – 2012-03-05 22:10:18

+1

需要相当基本而又合理的问题。但很长时间来解释。 – Mysticial 2012-03-05 22:10:55

回答

5

两件事情:

  • 检查,如果无符号整数< 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

在调用之前将errno设置为0可能会更好,然后检查是否有任何非零值。至少EINVAL似乎也可能发生。 – 2012-03-05 22:29:39

2

你可以读入一个unsigned long长和测试针对unsigned int类型的限制。

+0

这就是操作员>>已经在做的事情。 – 2012-03-05 22:17:53

+0

@BoPersson,你是说'''自动提升很久吗?即使它存在,它也需要在存储到unsigned int时截断。 – AShelly 2012-03-05 22:21:57

+0

我在说'operator >>'正在使用'num_get'来收集字符,将其转换为最大的无符号整数类型,然后在分配结果之前验证目标范围。就像你自己做了那样。 – 2012-03-05 22:30:05

2

当用户输入比UINT_MAX更高一些,cin它在UINT_MAX反正。该值也不能为负数。

如果您需要延长的范围内,使用unsigned long long输入,并投以unsigned int检查后。尽管如此,这不会防止超出unsigned long long范围的数字。

对于通用解决方案,您可以阅读string,并使用unsigned long long作为结果自己进行转换。

3

您的检查没有任何意义(编译器具有正确启用的警告会告诉您),因为您的值永远不会低于0且永远不会超过UINT_MAX,因为这些值是unsigned int类型的变量的最小值和最大值是)可以容纳。

使用流状态,以确定是否读入整数工作正常。

1

如果您尝试将其读取到unsigned int中,您将不得不将自己限制在unsigned int的约束条件下。

最常见的做法是将输入内容读取为string并对其进行解析以确保它在正确的范围内。验证完成后,您可以将其转换为unsigned int