सी ++ में इनपुट स्ट्रीम के लिए यह एक आसान काम नहीं है। फंक्शन scanf
सभी अपेक्षित प्रारूप प्राप्त करता है: "%d %*s %d"
और यह निर्धारित करने के लिए आगे बढ़ सकता है कि क्या हो रहा है।
दूसरी ओर, ऑपरेटर >>
बस वर्तमान प्रविष्टि पैरामीटर को संतुष्ट करने का प्रयास करता है।
आपके पास एक अंक तक पहुंचने तक इनपुट खाने के लिए अपने आईट्रीम मैनिपुलेटर लिखने की संभावना है।
template<typename C, typename T>
basic_istream<C, T>&
eat_until_digit(basic_istream<C, T>& in)
{
const ctype<C>& ct = use_facet <ctype<C>> (in.getloc());
basic_streambuf<C, T>* sb = in.rdbuf();
int c = sb->sgetc();
while (c != T::eof() && !ct.is(ctype_base::digit, c))
c = sb->snextc();
if (c == T::eof())
in.setstate(ios_base::eofbit);
return in;
}
int main()
{
int first, second;
cin >> first >> eat_until_digit >> second;
cout << first << " : " << second << endl;
}
आप का विस्तार करने और कोड ऊपर में सुधार प्राप्त करने के लिए आपको क्या चाहिए कर सकते हैं:
यह मेरी भोली कोड का प्रयास करें।
+1 उचित लगता है! ^^ और इसके बारे में क्या skips का एक सेट, जैसे 'std :: ios :: skip :: str', 'std :: ios :: skip :: dec', और यहां तक कि' std :: ios :: skip :: any'? बहुत गन्दा? (: – Rubens
@ रूबेन्स: मेरा अद्यतन उत्तर देखें, दूसरा भाग। – deepmax
क्या नहीं है 'std :: ctype :: scan_is' यह नहीं करता है? – 0x499602D2