2016-01-05 4 views
5

मैं Bjarne Stroustrup की प्रोग्रामिंग के माध्यम से काम कर रहा हूँ - सिद्धांत और व्यवहार सी ++ का उपयोग करना और निम्न उदाहरण के लिए आया था:सी ++ में cin एक int चर को स्ट्रिंग मान असाइन करने का प्रयास कर रहा है?

#include "std_lib_facilities.h" 

int main() { 
    /* Name and Age input */ 
    cout << "Please enter your first name and age\n"; 
    string first_name = "???"; 
    int age = -1.0; 
    cin >> first_name >> age; 
    cout << "Hello," << first_name << "(age " << (age * 12) << " months)\n"; 
    return 0; 
} 

आप कार्यक्रम और इनपुट कार्लोस 22 चलाते हैं, तो इसे सही ढंग से उत्पादन Hello, Carlos (age 22) होगा। हालांकि, अगर आप 22 कार्लोस में डालते हैं, तो वह कहता है कि आउटपुट Hello, 22 (age -1) होना चाहिए क्योंकि "कार्लोस एक पूर्णांक नहीं है ... इसे पढ़ा नहीं जाएगा"। हालांकि, जब मैं इसे चलाता हूं, तो यह Hello, 22 (age 0) देता है जो ऐसा लगता है कि यह कचरा मूल्य असाइन कर रहा है। मैं उत्सुक हूं कि यह क्यों हो रहा है, क्योंकि पुस्तक का तात्पर्य है कि जब तक आप एक पूर्णांक इनपुट नहीं करते हैं, तो यह age चर पर कुछ भी असाइन करने का प्रयास नहीं करेगा। मैंने ब्रेकपॉइंट्स के साथ कोड चलाया और गैर-पूर्णांक इनपुट दर्ज होने के बाद -1 से 0 में age के मानों की पुष्टि की।

क्या मैं कुछ गलत कर रहा हूं? या क्या यह एक विषमता है क्योंकि मैं इसे एक्सकोड के माध्यम से बना रहा हूं और जो भी संकलक उसमें शामिल है?

+0

यह एक 'अपरिभाषित व्यवहार' है जिसे आप प्राप्त कर रहे हैं। ऐसे मामलों में आउटपुट कुछ भी हो सकता है –

+4

सी ++ 11 आगे निकलने पर स्केलर प्रकार 0 पर सेट हो जाएंगे, सी ++ 11 से पहले मूल्य छूटा नहीं गया था। – user657267

+0

@ user657267, आह, इसके लिए धन्यवाद। मैं उलझन में था क्योंकि यह सी ++ 11 के लिए पुस्तक का अद्यतन संस्करण था, लेकिन आपकी टिप्पणी पढ़ने के बाद, मैंने इरेटा देखा और पर्याप्त यकीन है, इसके बारे में एक नोट था। धन्यवाद! – Dan

उत्तर

4

आप कॉल

cin >> age; 

आप std::strtol के लिए एक कॉल के साथ अंत से कॉल का निशान का पालन करें। strtol की वापसी मूल्य है: कोई रूपांतरण किया जा सकता है

  • हैं, तो 0 दिया जाता है।

चेक कॉल के बाद cin की स्थिति सुनिश्चित करें कि सभी निष्कर्षण सफल रहे थे बनाने के लिए।

cin >> first_name >> age; 
if (cin) 
{ 
    // Extraction was successful. 
    // Use the data. 
} 
else 
{ 
    // Extraction was not successful. 
    // Deal with the error. 
} 
+1

आह, यह समझ में आता है। मैंने बस पुस्तक के लिए इरेटा देखा और पाया: "यह वास्तव में एक इरेटा नहीं है, लेकिन कुछ कार्यान्वयन विफल होने पर शून्य से बाहर निकलता है। आखिरकार सभी करेंगे, लेकिन जब तक सी ++ 11 ने कोई नहीं किया। तो, आपको अपने कार्यान्वयन के विंटेज के आधार पर 0 या -1 मिलता है। " तो जैसे आपने बताया, यह मानकों को कार्यान्वित कर रहा है जैसा इसे करना चाहिए। धन्यवाद! – Dan

+1

@ डैन, यह दुर्भाग्यपूर्ण है कि भाषा के पिता द्वारा भी किताबें अप्रचलित हो जाती हैं, बहुत पहले नहीं। –

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