कहें कि मेरे पास एक प्रोग्राम है जो पूर्णांक में आता है। यदि उपयोगकर्ता श्रेणी संख्या, या किसी पत्र या किसी चीज़ से बाहर निकलता है तो मैं प्रोग्राम को अलग होने से कैसे रोकूं?मैं सिने को कैसे स्वच्छ कर सकता हूं?
उत्तर
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;
}
}
आशा है कि इससे मदद मिलती है। शुभ लाभ!
आप जांच सकते हैं कि पढ़ना सफल था या नहीं cin.good()
और cin.fail()
के साथ।
कुछ इस तरह आप अच्छी तरह से जाँच के बाद बफर स्पष्ट करने के लिए अगर मैं याद सही
if (cin.fail())
{
cout<<"need to put a number"<<endl;
cin.clear();
cin.ignore();
}
यदि आप अपने कोड में पुस्तकालयों को जोड़ना नहीं चाहते हैं तो आप भी ...() कथन का उपयोग कर सकते हैं। अपने करते, जबकि आप उपयोगकर्ता इनपुट के लिए पूछने के लिए और फिर, जबकि हिस्सा आप इस कि जांच करने के लिए सक्षम हो जाएगा में तो अपने चर करने के लिए इसे प्राप्त होगा में डेटा अगर डेटा के लिए पूछने के लिए जारी नहीं आप उम्मीद कर रहे हैं है।
सिर्फ एक और विकल्प .... भले ही इस सवाल का जवाब पहले ही उल्लेख पर्याप्त रूप से
मैं तारों के रूप में इनपुट पढ़ने पसंद करते हैं और अधिक से अधिक काम करना चाहिए, और तो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;
}
कैच-ऑल खंड w/ओ फिर से फेंक नहीं-नहीं है। –
क्या आप इसे समझा सकते हैं, या उद्धरण प्रदान कर सकते हैं? –
@VladLazarenko: फिक्स्ड। –
आप पूर्णांक में मान्य इनपुट का सबसे सरल और तेजी से जांच के लिए निम्नलिखित कोड का उपयोग कर सकते हैं:
#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() इनपुट स्ट्रीम को साफ़ करता है ताकि नया इनपुट फिर से लिया जा सके। अगर लूप नहीं किया जाता है तो लूप अनंत राज्य में होगा।
- 1. मैं सिने बफर कैसे फ्लश कर सकता हूं?
- 2. मैं एचटीएमएल को कपड़ा और स्वच्छ कैसे बना सकता हूं?
- 3. एक बैश स्क्रिप्ट में, मैं उपयोगकर्ता इनपुट को कैसे स्वच्छ कर सकता हूं?
- 4. मैं पर्ल में अवैध यूटीएफ -8 को कैसे स्वच्छ कर सकता हूं?
- 5. मैं जेएसटीएल/ईएल में तारों को कैसे जोड़ और स्वच्छ कर सकता हूं?
- 6. मैं आउटपुटस्ट्रीम को कैसे कार्यान्वित कर सकता हूं जिसे मैं रिवाइंड कर सकता हूं?
- 7. मैं Win32 असेंबली को अनइंस्टॉल कैसे कर सकता हूं और WinSxS को साफ़ कर सकता हूं?
- 8. मैं अच्छे के लिए व्यूस्टेट कैसे बंद कर सकता हूं?
- 9. मैं वेबटेस्ट कैसे विफल कर सकता हूं?
- 10. मैं गिट टैग कैसे कर सकता हूं?
- 11. मैं अपने सभी बॉक्स 2 डी टकरावों को एक स्वच्छ, प्रबंधनीय ढंग से कैसे ट्रैक कर सकता हूं?
- 12. मैं कैसे परीक्षण कर सकता हूं: RSpec
- 13. मैं कैसे अक्षम कर सकता हूं और फिर चेतावनी को पुनः सक्षम कर सकता हूं?
- 14. मैं जीसी परीक्षण कैसे कर सकता हूं?
- 15. मैं प्रतिनिधि कैसे प्राप्त कर सकता हूं?
- 16. मैं एक स्वच्छ रूबी मिश्रण कैसे लिखूं?
- 17. मैं एक्सकोड में ब्रांड्स को मिलान कैसे कर सकता हूं?
- 18. मैं तालिका को रीसेट कैसे कर सकता हूं। DefaultView.RowFilter?
- 19. मैं ईमेल पते को ऊपरी केस कैसे कर सकता हूं?
- 20. मैं UIScrollView ज़ूम बाउंस को कैसे रद्द कर सकता हूं?
- 21. मैं इनो सेटअप इंस्टॉलेशन को कैसे लॉग कर सकता हूं?
- 22. मैं सदस्यwise क्लोन() को कैसे कॉल कर सकता हूं?
- 23. मैं सभी सीएसएस शॉर्टैंड्स को कैसे याद कर सकता हूं?
- 24. मैं java.awt.Composite को कुशलतापूर्वक कैसे कार्यान्वित कर सकता हूं?
- 25. मैं जावा कचरा कलेक्टर को कैसे अक्षम कर सकता हूं?
- 26. मैं एक विशिष्ट फ़ोल्डर को कैसे अनजिप कर सकता हूं?
- 27. मैं इस सूचीदृश्य को अचयनित कैसे कर सकता हूं?
- 28. मैं आईएमएपी की आईडीईएल को कैसे बाधित कर सकता हूं?
- 29. मैं एनएसडीएटा को एनएसएआरएआरए में कैसे परिवर्तित कर सकता हूं?
- 30. मैं ओपनजेपीए एसक्यूएल लॉगिंग को कैसे कॉन्फ़िगर कर सकता हूं?
http://www.parashift.com/c++-faq/istream-and-ignore.html – chris