2012-03-05 13 views
6

मैं एक unsigned intcin का उपयोग कर के रूप में इस पढ़ने के लिए कोशिश कर रहा हूँ:पढ़ना 'अहस्ताक्षरित 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; 
} 

बहरहाल, जब भी मैं अहस्ताक्षरित पूर्णांक (UINT_MAX) की ऊपरी सीमा से अधिक कोई मान दर्ज कार्यक्रम 3435973836 प्रदर्शित करता है। मैं कैसे जांचूं कि उपयोगकर्ता द्वारा दिया गया इनपुट 0 से UINT_MAX के बीच आता है या नहीं?

+12

'((नंबर <0) || ((अहस्ताक्षरित int) संख्या> UINT_MAX))' मैं भी वर्णन नहीं कर सकते, तो यह कैसे गुमराह है। – ildjarn

+0

शायद कुछ आसान, और निश्चित रूप से एक अच्छी किताब के साथ शुरू करें। –

+1

पूछने के लिए काफी बुनियादी अभी तक उचित सवाल है। लेकिन व्याख्या करने के लिए बहुत लंबा है। – Mysticial

उत्तर

5

दो बातें:

  • अगर एक अहस्ताक्षरित पूर्णांक < 0 है या> UINT_MAX व्यर्थ है जांच की जा रही है, क्योंकि यह है कि मूल्य तक पहुंचने कभी नहीं कर सकते हैं! आपका कंपाइलर शायद पहले से ही एक चेतावनी के साथ शिकायत करता है जैसे कि "प्रकार की सीमित सीमा के कारण तुलना हमेशा झूठी होती है"।

  • एकमात्र समाधान जो मैं सोच सकता हूं वह एक स्ट्रिंग में इनपुट को पकड़ रहा है, फिर पुरानी शैली वाली strtoul() का उपयोग करें जो अतिप्रवाह के मामले में इरनो सेट करता है।

यानी .:

#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 एक अहस्ताक्षरित लंबे रिटर्न; कोई फ़ंक्शन strtou() नहीं है, एक हस्ताक्षरित int वापस कर रहा है।

+0

कॉल से पहले इरनो को 0 सेट करने के लिए शायद बेहतर है और फिर किसी गैर-शून्य मान की जांच करें। ऐसा लगता है कि कम से कम EINVAL भी हो सकता है। –

2

आपने अहस्ताक्षरित लंबे और परीक्षण में पढ़ सकता है कि अहस्ताक्षरित int सीमा के खिलाफ।

+0

यही ऑपरेटर >> पहले से ही कर रहा है। –

+0

@ बोपर्सन, क्या आप कह रहे हैं कि '>>' स्वचालित रूप से लंबे समय तक प्रचारित है? यहां तक ​​कि अगर ऐसा होता है, तो एक हस्ताक्षरित int में संग्रहीत करते समय इसे छोटा करना होगा। – AShelly

+0

मैं कह रहा हूं कि 'ऑपरेटर >>' 'num_get' का उपयोग कर रहा है जो वर्ण एकत्र करता है, सबसे बड़े हस्ताक्षरित पूर्णांक प्रकार में परिवर्तित होता है और फिर परिणाम निर्दिष्ट करने से पहले लक्ष्य सीमा को सत्यापित करता है। जैसे कि आपने स्वयं किया था। –

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 में परिवर्तित कर सकते हैं।

संबंधित मुद्दे