2010-08-27 13 views
5

ठीक है, इसलिए मुझे सी ++ iostreams के साथ कुछ समस्याएं हैं जो बहुत अजीब लगती हैं, लेकिन यह शायद परिभाषित व्यवहार है, क्योंकि यह एमएसवीसी ++ और जी ++ दोनों के साथ होता है।पूर्णांक ओवरफ़्लो C++ iostreams के साथ त्रुटियों का कारण क्यों बनता है?

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    cout << a << endl; 
    cin >> a; 
    cout << a << endl; 

    return 0; 
} 

मैं जानबूझकर अतिप्रवाह एक int की अधिकतम सीमा से बड़ा है कि एक मूल्य CIN पहले देकर, cin.operator>>() करने के लिए सभी आगे कॉल तुरंत किसी कारण से वापस आ जाएगी, तो:

मैं इस कार्यक्रम है कहो , और a कुछ मूल्य पर सेट है। मान अपरिभाषित प्रतीत होता है।

क्यों, और यह व्यवहार कहां दस्तावेज किया गया है? क्या ऐसा पता लगाने का कोई तरीका है कि ऐसा अतिप्रवाह हुआ है या नहीं?

इसके अलावा, यह वही प्रोग्राम काम करता है जैसा मेरा इरादा है। यदि मैं मान को ओवरफ़्लो करता हूं, तो यह a कुछ मान देगा, और जारी रहेगा जैसे अतिप्रवाह कभी नहीं हुआ।

#include <cstdio> 
using namespace std; 

int main() 
{ 
    int a; 
    scanf("%d", &a); 
    printf("%d\n", a); 
    scanf("%d", &a); 
    printf("%d\n", a); 
    scanf("%d", &a); 
    printf("%d\n", a); 

    return 0; 
} 

उत्तर

7

iostreams त्रुटियों का पता लगाने और एक त्रुटि राज्य में प्रवेश करने के लिए डिज़ाइन किया गया है की स्थापना कर रहे है। एक गैर-संख्यात्मक स्ट्रिंग दर्ज करने के रूप में आपको पूर्णांक ओवरफ़्लो से एक ही परिणाम मिलता है।

कास्ट cin (या किसी भी स्ट्रीम) bool या जाँच cin.rdstate() को निर्धारित करने के लिए यदि कोई त्रुटि हुई है।

त्रुटि को दूर करने के लिए cin.clear() और cin.ignore() पर कॉल करें। यह असफल वर्णों के बिंदु पर उठाएगा।

आधिकारिक दस्तावेज़ीकरण के लिए, मानक दुर्भाग्य से iostreams के आंतों में थोड़ा अचूक हो जाता है। §27.6.1.2.1, 27.6.1.2.2, और 22.2.2.1.1/11 (मजाक नहीं) देखें:

- चरण 2 में संचित वर्ण के अनुक्रम उत्पन्न कर scanf एक इनपुट रिपोर्ट करने के लिए विफलता। ios_base :: विफलता को गलती के लिए असाइन किया गया है।

documentation for scanf बस के रूप में अभेद्य है, और मैं इसे विश्वास पर ले कि अतिप्रवाह एक त्रुटि माना जाता है जाएगा।

1

मुझे लगता है कि अमान्य पढ़ने के कारण सीन खुद को एक त्रुटि स्थिति में स्थापित कर रहा है।

पहला उत्तर यहां बताता है।

http://www.dreamincode.net/forums/topic/93200-cin-checking-and-resetting-error-state/

बस इस कोड की कोशिश की और यह राज्य विफल

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    if(!cin) 
    { 
     cin.clear(); 
    } 
    cout << a << endl; 
    cin >> a; 
    if(!cin) 
    { 
     cin.clear(); 
    } 
    cout << a << endl; 

    return 0; 
} 
0

a एक अनिर्धारित मूल्य के साथ शुरू होता है। यह cin की गलती नहीं है। प्रयास करें:

if (cin >> a) { 
    cout << a endl; 
} 

यह जाँच करेगा कि क्या a में पढ़ने a

उपयोग करने से पहले सफल रहा
संबंधित मुद्दे