2011-05-03 22 views
17

निम्न लूप में, यदि हम अक्षरों की संख्या cin इनपुट के रूप में टाइप करते हैं, तो यह अनंत लूप में जाता है। क्या कोई मुझे बता सकता है कि ऐसा क्यों होता है?एक संख्या होने पर स्ट्रिंग टाइप करते समय सीन के साथ अनंत लूप

जब हम cin का उपयोग करते हैं, तो इनपुट एक संख्या नहीं है, तो उपर्युक्त समस्याओं से बचने के लिए इसका पता लगाने के तरीके हैं?

unsigned long ul_x1, ul_x2; 

while (1) 
{ 
    cin >> ul_x1 >> ul_x2; 
    cout << "ux_x1 is " << ul_x1 << endl << "ul_x2 is " << ul_x2 << endl; 
} 

उत्तर

23

वैसे आप हमेशा एक अनंत लूप होगा, लेकिन मुझे पता है कि तुम सच में जानना चाहते हैं क्यों CIN अपने अनंत लूप freerun के कारण यात्रा प्रत्येक पाश पर इनपुट के लिए उत्साह नहीं रखता है।

कारण यह है कि आपके द्वारा वर्णित स्थिति में सीन विफल रहता है और उन चरों में कोई और इनपुट नहीं पढ़ेगा। शिन खराब इनपुट देकर, सीन fail state में हो जाता है और लूप को मुक्त चलाने के कारण इनपुट के लिए कमांड लाइन को संकेत देता है।

सरल सत्यापन के लिए, आप जांच कर अपने इनपुट को सत्यापित करने के लिए सीन का उपयोग करने का प्रयास कर सकते हैं कि क्या असफल असफल स्थिति में है या नहीं। विफल होने पर clear the fail राज्य होता है और स्ट्रीम को throw away the bad input पर बल देता है। यह सामान्य ऑपरेशन के लिए सीन देता है ताकि आप अधिक इनपुट के लिए संकेत दे सकें।

if (cin.fail()) 
    { 
    cout << "ERROR -- You did not enter an integer"; 

    // get rid of failure state 
    cin.clear(); 

    // From Eric's answer (thanks Eric) 
    // discard 'bad' character(s) 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

    } 

अधिक परिष्कृत सत्यापन के लिए, आप यकीन है कि यह मेल खाता है कि आप क्या उम्मीद करने के लिए स्ट्रिंग पर पहली बार एक स्ट्रिंग में पढ़ सकते हैं और अधिक परिष्कृत जांच कर करना चाह सकते हैं।

+0

या के बराबर है, एक stringstream। – Maxpm

+0

अगर मैं cin.clear() को cin विफल होने के बाद कॉल करता हूं, तो अगली बार जब मैं cin >> x कहता हूं तो यह अभी भी इनपुट के लिए क्यों नहीं पूछता है? –

+0

यह उत्तर समस्या को ठीक नहीं करता है ओपी के रूप में यह ** अपूर्ण ** है। कृपया मेरे उत्तर पर एक नज़र डालें :) –

6

ध्यान

कृपया निम्न समाधान पर ध्यान देना। यह आपके मामले में त्रुटि को साफ़ करने के लिए अभी तक पूरा नहीं हुआ है। आपको अभी भी एक अनंत लूप मिलेगा!

if (cin.fail()) 
{ 
    cout << "Please enter an integer"; 
    cin.clear(); 
} 

पूरा समाधान

कारण आप धारा के विफल राज्य है, साथ ही छोड़ें असंसाधित पात्रों स्पष्ट की जरूरत है। अन्यथा, खराब चरित्र अभी भी वहां है और आपको अभी भी अनंत लूप मिलते हैं। आप इसे प्राप्त करने के लिए बस std :: cin.ignore() कर सकते हैं। उदाहरण के लिए,

if (cin.fail()) 
{ 
     cout << "Please enter an integer"; 
     // clear error state 
     cin.clear(); 
     // discard 'bad' character(s) 
     cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
} 

एक और समाधान

तुम भी getline और stringstream प्राप्त करने के लिए उपयोग कर सकते हैं। यहां एक संक्षिप्त उदाहरण दिया गया है।

string input; 
    while (1) 
    { 
     getline(cin, input); 
     stringstream(input) >> x; 
     cout << x << endl; 
    } 
+0

धन्यवाद, मेरे उत्तर में बग तय किया –

1

शायद, यह है, क्योंकि

  1. CIN एक स्ट्रीमिंग का समारोह है। जब संख्याओं के बजाय गैर-संख्यात्मक दर्ज किया जाता है, तो इसे अनदेखा किया जाता है। और आप पुनः प्रविष्टि के लिए संकेत दिए गए हैं।
  2. भले ही आपने संख्यात्मक इनपुट दिया हो, आपको अनंत इनपुट के बाद से अधिक इनपुट के लिए संकेत दिया जाएगा।

आप इस समस्या को हल कर सकते हैं: 1. स्ट्रिंग इनपुट में लेने के लिए कोई फ़ंक्शन बनाएं। 2. इसे रूपांतरण के बाद संख्यात्मक के रूप में वापस करें। रूपांतरण के लिए strtod() का उपयोग करें।

आशा इस मदद करता है :)

0

एक अन्य विकल्प operator! है, यह बेहतर अभी तक सदस्य समारोह fail()

//from Doug's answer 
if (!cin) 
{ 
    cout << "ERROR -- You did not enter an integer"; 

    // get rid of failure state 
    cin.clear(); 

    // From Eric's answer (thanks Eric) 
    // discard 'bad' character(s) 
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
}