2012-05-31 12 views
7

कोडCIN बनाने के लिए यहां केवल संख्या ले

double enter_number() 
{ 
    double number; 
    while(1) 
    { 

     cin>>number; 
     if(cin.fail()) 
     { 
      cin.clear(); 
      cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
      cout << "Invalid input " << endl; 
     } 
     else 
     break; 
     cout<<"Try again"<<endl; 
    } 
    return number; 
} 

मेरे समस्या यह है कि जब मैं 1x की तरह कुछ डालें और फिर 1 इनपुट के रूप में चरित्र है कि एक और रन के लिए बाहर छोड़ दिया है देख के बिना लिया जाता है है। क्या कोई तरीका है कि इसे किसी वास्तविक संख्या के साथ कैसे काम करना है। 1.8?

+0

सब कुछ एक स्ट्रिंग में पढ़ें और तदनुसार इनपुट पार्स करें? – Rhexis

+0

cin.get() का उपयोग करें और फिर ईओएफ चरित्र की जांच करें? – Ansari

उत्तर

7

मैं std::getline और std::string का उपयोग पूरी लाइन को पढ़ने के लिए चाहते हैं और उसके बाद ही पाश से बाहर तोड़ जब आप करने के लिए पूरे लाइन में बदल सकते हैं एक डबल।

#include <string> 
#include <sstream> 

int main() 
{ 
    std::string line; 
    double d; 
    while (std::getline(std::cin, line)) 
    { 
     std::stringstream ss(line); 
     if (ss >> d) 
     { 
      if (ss.eof()) 
      { // Success 
       break; 
      } 
     } 
     std::cout << "Error!" << std::endl; 
    } 
    std::cout << "Finally: " << d << std::endl; 
} 
19

जब सीन एक इनपुट से मुकाबला करता है तो यह निर्दिष्ट चर (जैसे एक वर्ण को एक पूर्णांक चर में इनपुट करने) में ठीक से पढ़ नहीं सकता है, यह एक त्रुटि स्थिति में जाता है और इनपुट को इसके बफर में छोड़ देता है।

आपको इस परिदृश्य को ठीक से संभालने के लिए कई चीजें करना है।

  1. आपको इस त्रुटि स्थिति का परीक्षण करना होगा।
  2. आपको त्रुटि स्थिति को साफ़ करना होगा।
  3. आपको या तो त्रुटि डेटा उत्पन्न करने वाले इनपुट डेटा को वैकल्पिक रूप से संभालना होगा, या इसे फ़्लश करना होगा और उपयोगकर्ता को दोबारा प्रिंट करना होगा।

निम्नलिखित कोड इन तीनों चीजों को करने के कई तरीकों में से एक प्रदान करता है।

#include<iostream> 
#include<limits> 
using namespace std; 
int main() 
{ 

    cout << "Enter an int: "; 
    int x = 0; 
    while(!(cin >> x)){ 
     cin.clear(); 
     cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
     cout << "Invalid input. Try again: "; 
    } 
    cout << "You enterd: " << x << endl;   
} 

तुम सिर्फ कुछ बड़े मान पास कर सकता 1000 की तरह cin.ignore करने के लिए और यह वास्तव में सभी व्यावहारिक प्रयोजनों के लिए एक ही तरीके से व्यवहार करने की संभावना है।

आप इनपुट प्रयास के बाद भी सिने का परीक्षण कर सकते हैं और इसे इस तरह से संभाल सकते हैं, जैसे कुछ (! Cin) {// त्रुटि को साफ़ करें}।

बाहर चेक अन्य सदस्य कार्यों धारा राज्य संभाल करने के लिए IStream संदर्भ: http://cplusplus.com/reference/iostream/istream/

+0

कि 'cin.ignore' लाइन इसे फ्लश कर रही है, है ना? – Jeff

+0

@ जेफ हाँ, यह बफर को फहराता है। जब आप बिन में '\ n' छोड़ते हैं तो इनपुट प्राप्त करते समय आप सीइन का उपयोग करते समय इसका उपयोग कर सकते हैं और हटा नहीं पाते हैं (मुझे विश्वास है, पूरी तरह से सुनिश्चित नहीं है, शायद यह cin.get था) तो getline बस सीमित हो जाता है पल यह इनपुट बफर से जुड़ा होता है क्योंकि यह बाईं ओर '\ n' से मुकाबला करता है। –

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