2012-11-08 13 views
7

कहें कि मेरे पास एक प्रोग्राम है जो पूर्णांक में आता है। यदि उपयोगकर्ता श्रेणी संख्या, या किसी पत्र या किसी चीज़ से बाहर निकलता है तो मैं प्रोग्राम को अलग होने से कैसे रोकूं?मैं सिने को कैसे स्वच्छ कर सकता हूं?

+4

http://www.parashift.com/c++-faq/istream-and-ignore.html – chris

उत्तर

2

cin के आधार वर्ग std::basic_istream है की जरूरत है क्या करना चाहिए। इनपुट स्ट्रीम एक पुनर्प्राप्ति योग्य त्रुटि इंगित करता है यदि यह धारा से अनुरोधित डेटा निकालने नहीं कर सकता है। उस त्रुटि बिट की जांच करने के लिए, std::basic_istream::fail() विधि का उपयोग किया जाना चाहिए - यदि कोई विफलता हो या false यदि सब कुछ ठीक है तो यह true देता है। यह याद रखना महत्वपूर्ण है कि यदि कोई त्रुटि है, तो डेटा स्ट्रीम में छोड़ा गया है और, निश्चित रूप से, त्रुटि बिट्स को भी std::basic_istream::clear() का उपयोग करके साफ़ किया जाना चाहिए। साथ ही, एक प्रोग्रामर को गलत डेटा को अनदेखा करना होगा, या अन्यथा कुछ और पढ़ने का प्रयास फिर से विफल हो जाएगा। उस उद्देश्य के लिए, std::basic_istream::ignore() विधि का उपयोग किया जा सकता है। मानों की वैध सीमा के लिए, इसे मैन्युअल रूप से जांचना होगा। ठीक है, पर्याप्त सिद्धांत, यहां एक साधारण उदाहरण है:

#include <limits> 
#include <iostream> 

int main() 
{ 
    int n = 0; 

    for (;;) { 
     std::cout << "Please enter a number from 1 to 10: " << std::flush; 
     std::cin >> n; 

     if (std::cin.fail()) { 
      std::cerr << "Sorry, I cannot read that. Please try again." << std::endl; 
      std::cin.clear(); 
      std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); 
      continue; 
     } 

     if (n < 1 || n > 10) { 
      std::cerr << "Sorry, the number is out of range." << std::endl; 
      continue; 
     } 

     std::cout << "You have entered " << n << ". Thank you!" << std::endl; 
     break; 
    } 
} 

आशा है कि इससे मदद मिलती है। शुभ लाभ!

2

कुछ इस तरह आप अच्छी तरह से जाँच के बाद बफर स्पष्ट करने के लिए अगर मैं याद सही

if (cin.fail()) 
    { 
     cout<<"need to put a number"<<endl; 
     cin.clear(); 
     cin.ignore(); 
    } 
0

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

सिर्फ एक और विकल्प .... भले ही इस सवाल का जवाब पहले ही उल्लेख पर्याप्त रूप से

4

मैं तारों के रूप में इनपुट पढ़ने पसंद करते हैं और अधिक से अधिक काम करना चाहिए, और तोboost::lexical_cast<> के साथ उन्हें sanitizing:

#include <boost/lexical_cast.hpp> 
#include <iostream> 
#include <string> 

int main() { 
    std::string s; 
    while(std::cin >> s) { 
    try { 
     int i = boost::lexical_cast<int>(s); 
     std::cout << "You entered: " << i << "\n"; 
    } catch(const std::bad_cast&) { 
     std::cout << "Ignoring non-number: " << s << "\n"; 
    } 
    } 
} 

पोस्टस्क्रिप्ट: यदि आप बूस्ट के लिए एलर्जी हैं, तो आप lexical_cast के इस कार्यान्वयन का उपयोग कर सकते हैं:

template <class T, class U> 
T lexical_cast(const U& u) { 
    T t; 
    std::stringstream s; 
    s << u; 
    s >> t; 
    if(!s) 
    throw std::bad_cast(); 
    if(s.get() != std::stringstream::traits_type::eof()) 
    throw std::bad_cast(); 
    return t; 
} 
+0

कैच-ऑल खंड w/ओ फिर से फेंक नहीं-नहीं है। –

+0

क्या आप इसे समझा सकते हैं, या उद्धरण प्रदान कर सकते हैं? –

+0

@VladLazarenko: फिक्स्ड। –

0

आप पूर्णांक में मान्य इनपुट का सबसे सरल और तेजी से जांच के लिए निम्नलिखित कोड का उपयोग कर सकते हैं:

#include "stdafx.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 

    int intb; 
    while(!(cin>>intb)){ 
     cin.clear(); 
     cin.ignore (1000, '\n'); 
     cout<<"Invalid input enter again: "<<endl; 

    } 
    cout<<"The value of integer entered is "<<b<<endl; 

     return 0; 
} 

जबकि पाश जब तक यह सही इनपुट हो जाता है पुनरावृत्ति रहती है। cin.clear() त्रुटि नियंत्रण स्थिति को बदलता है। cin.ignore() इनपुट स्ट्रीम को साफ़ करता है ताकि नया इनपुट फिर से लिया जा सके। अगर लूप नहीं किया जाता है तो लूप अनंत राज्य में होगा।

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