2012-09-13 17 views
8
#include<iostream>; 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    std::cin >> a >> b; 
    std::cout << a << "+" << b << "=" << a+b << std::endl; 
    return 0; 
} 

है जब मैं प्रवेश 3 4 इनपुट के रूप में, उत्पादन 3+4=7 हो जाएगा, ठीक है, यह अजीब बात है क्या CIN क्या करता है; लेकिन जब मैं a b दर्ज करता हूं, तो आउटपुट 0+0=0 (यह 0 और 0 क्यों है?); सबसे भ्रमित, a 4, यह 0+0=0 होगा (क्यों नहीं '0 + 4 = 4' ?????); फिर मैं एक और कार्यक्रम लिखता हूं।जब वहाँ एक त्रुटि

#include<iostream>; 

int main() 
{ 
    int a = 1; 
    int b = 2; 
    std::cin >> a; 
    std::cin.clear(); 
    std::cin >> b; 
    std::cout << a << "+" << b << "=" << a+b << std::endl; 
    return 0; 
} 

जब मैं a 4 दर्ज करते हैं, यही कारण है कि यह अभी भी 0+0=0 है? यह 0+4=4 हो नहीं करना चाहिए?

सभी गर्म दिल के लिए धन्यवाद !!

मैं प्रोजे 3 लिखता हूं, यह जांचने के लिए कि क्या होगा जब मैं int a=1;int b=2 नहीं लिखूंगा;

2 

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a,b; 
    cin >> a ; 
    cin >> b; 
    cout<< a << "+"<< b <<"="<< a+b << endl; 
    return 0; 
} 

जब a b फिर, यह 0+-1218170892=-1218170892 आउटपुट (क्यों 0+0=0 ?? नहीं है)

+0

इनपुट के एक मूल्य प्राप्त एक पूर्णांक होने की उम्मीद है, एक चरित्र नहीं। "ए", "3.141" या "जो कुछ भी" दर्ज करना मान्य नहीं है। यदि आपका इनपुट "ए" है, तो प्रोग्राम यह नहीं जानता कि आपने "ए" को एक चर के रूप में उपयोग किया है और आप इसके बजाय डिफ़ॉल्ट मान का उपयोग करना चाहते हैं। – stefan

+0

यह स्पष्ट है कि यह सी ++ 11 है, क्योंकि अन्यथा, मान 1 और 2 होंगे, 0 नहीं। – Drise

+0

आपके संपादन का उत्तर देने के लिए: आपने इनपुट से कोई नहीं हटाया है। आपको 'cin.clear() की आवश्यकता है; cin.ignore (1); ', ताकि दूसरा निष्कर्षण सफल हो जाएगा। – Drise

उत्तर

1

सभी istreams की तरह, std::cin त्रुटि बिट्स है। जब त्रुटियां होती हैं तो ये बिट सेट होते हैं। उदाहरण के लिए, आप good(), bad(), eof(), आदि जैसे कार्यों के साथ त्रुटि बिट्स के मान पा सकते हैं। यदि आप खराब इनपुट पढ़ते हैं (fail() रिटर्न true), झंडे को साफ़ करने के लिए clear() का उपयोग करें। आपत्तिजनक चरित्र को हटाने के लिए आपको ignore(1); की भी आवश्यकता होगी।

अधिक जानकारी के लिए State functions अनुभाग देखें। http://en.cppreference.com/w/cpp/io/basic_ios

+0

धन्यवाद। लेकिन मैं सोच रहा हूं कि क्यों ए और बी दोनों का मान 0 – user1668903

+0

बन गया है यदि आप खराब इनपुट पढ़ते हैं, तो 'खराब() 'अभी भी झूठी वापसी करेगा; यह 'असफल()' है जो सच हो जाएगा। और जो पृष्ठ आप उद्धृत करते हैं वह भ्रामक रूप से सरलीकृत है, और 'अच्छा() 'के संबंध में बस गलत है (जो कोई त्रुटि नहीं होने पर भी झूठी वापसी कर सकती है)। इसे फेंक दो, और कुछ बेहतर खोजें। –

+0

आप सी ++ 11 का उपयोग कर रहे हैं: * अगर निष्कर्षण विफल रहता है, तो शून्य को शून्य लिखा जाता है और विफलता सेट की जाती है। ** (सी ++ 11 के बाद से) ***। – Drise

0

std :: cin एक istream उदाहरण है और इस प्रकार यह कुछ त्रुटि अमान्य पढ़ने पर इसकी त्रुटि स्थिति को बनाए रखता है।

आदेश में "इलाज" यह तुम दोनों अपने ध्वज

std::cin.clear(); 

स्पष्ट और उसके बफर फ्लश चाहिए।

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 

हालांकि क्या अधिक आश्चर्य की बात है कि यह वापस नहीं करता है 1 + 2 = 3 जब आप इनपुट अमान्य वर्ण, मैं क्या इसे अद्यतन करने के प्रयास कर रही है पर कोई साइड इफेक्ट के लिए एक असफल CIN धारा उम्मीद करेंगे के रूप में ।

+1

ओपी सी ++ 11 का उपयोग कर रहा है: * अगर निष्कर्षण विफल रहता है, तो शून्य को शून्य लिखा जाता है और विफलता सेट की जाती है। ** (सी ++ 11 के बाद से) *** – Drise

+0

क्या यह सिर्फ इन्स के साथ मामला है, या यह उपयोगकर्ता प्रकारों के लिए एक सामान्य नियम है कि अगर स्ट्रीमिंग विफल हो जाती है, तो ऑब्जेक्ट को अपनी डिफ़ॉल्ट स्थिति में वापस जाना चाहिए? मुझे हमेशा लगता है कि किसी ऑब्जेक्ट में स्ट्रीमिंग दोषपूर्ण तर्क है। कारखाने धाराओं से पढ़ने वाले डेटा के साथ ऑब्जेक्ट्स बनाते हैं, ऑब्जेक्ट्स को स्ट्रीम नहीं किया जाता है .. – CashCow

+0

"* किसी ऑब्जेक्ट में स्ट्रीमिंग दोषपूर्ण तर्क है। कारखाने धाराओं से पढ़ने वाले डेटा के साथ ऑब्जेक्ट्स बनाते हैं, ऑब्जेक्ट्स को स्ट्रीम नहीं किया जाता है" - स्ट्रीमिंग 'ऑपरेटर <<' अनिवार्य रूप से पूर्व-मौजूदा ऑब्जेक्ट्स (बाय-रेफरेंस पैरामीटर दिया गया) में है, और यद्यपि कोई नया ऑब्जेक्ट बनाने वाला फैक्ट्री काफी वांछनीय हो सकता है, ऐसे समय होते हैं जब ऐसा नहीं होता (उदाहरण के लिए जब आप बफर चाहते हैं और अन्य संसाधनों का ऑब्जेक्ट पहले से ही अगले मूल्य के लिए फिर से उपयोग किया गया है) और "फैक्ट्री" स्टैक पर ऑब्जेक्ट्स कैसे बनायेगा (अत्यधिक वांछनीय जब तक ऑब्जेक्ट रन-टाइम पॉलिमॉर्फिक नहीं होते हैं, विस्तारित जीवनकाल आदि की आवश्यकता होती है)? –

0

मूल्य C++ 11 के अनुसार त्रुटि पर शून्य पर सेट किया गया है: यदि निष्कर्षण विफल रहता है, शून्य मान और विफलता सेट पर लिखा जाता है।

'एक 4' उदाहरण पर, दोनों मान 0 क्योंकि बफर नहीं किया गया है फ्लश/मंजूरी दे दी हैं, इसलिए दूसरे CIN पढ़ने अभी भी त्रुटि पढ़ रही है, और यह भी 0.

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