2012-03-05 72 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