2013-09-28 9 views
6

scanf एक साथ का मिलान नहीं हुआ टोकन छोड़ करने की अनुमति है, बस पैटर्न के लिए * जोड़ने, के रूप में:/एसटीडी का उपयोग कर लंघन टोकन :: CIN

int first, second; 
scanf("%d %*s %d", &first, &second); 

वहाँ std::cin के साथ किसी भी बराबर दृष्टिकोण है? जैसे (जाहिर है, अतिरिक्त चर के उपयोग बख्शते) कुछ:

int first, second; 
std::cin >> first >> `std::skip` >> second; 

उत्तर

3

सी ++ में इनपुट स्ट्रीम के लिए यह एक आसान काम नहीं है। फंक्शन 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; 
} 

आप का विस्तार करने और कोड ऊपर में सुधार प्राप्त करने के लिए आपको क्या चाहिए कर सकते हैं:

यह मेरी भोली कोड का प्रयास करें।

+0

+1 उचित लगता है! ^^ और इसके बारे में क्या skips का एक सेट, जैसे 'std :: ios :: skip :: str', 'std :: ios :: skip :: dec', और यहां तक ​​कि' std :: ios :: skip :: any'? बहुत गन्दा? (: – Rubens

+1

@ रूबेन्स: मेरा अद्यतन उत्तर देखें, दूसरा भाग। – deepmax

+0

क्या नहीं है 'std :: ctype :: scan_is' यह नहीं करता है? – 0x499602D2

3

आप शायद C++ String Toolkit Library के लिए देख रहे हैं। के लिए

चेक इस अधिक example

या आप ignore समारोह इस तरह से कोशिश कर सकते हैं:

std::cin >> val1; 
std::cin.ignore (1234, ' '); 
std::cin >> val3; 

कुछ इस तरह: -

template <class charT, class traits> 
inline std::basic_istream<charT, traits> & 
ignoreToken (std::basic_istream<charT, traits> &strm) 
{ 
    strm.ignore (1234, ' '); 
    return strm; 
} 

और फिर तरह का उपयोग करें:

cin >> val1 >> ignoreToken >> val3 >> ignoreToken >> val5; 
+0

हालांकि यह एसएलएल से एकमात्र उपलब्ध विकल्प प्रतीत होता है, मैं कुछ थोड़ा सा अपेक्षा करने की उम्मीद कर रहा था। एक 'std :: ios :: skip :: str' और' std :: ios :: skip :: dec' और यहां तक ​​कि 'std :: ios :: skip :: any' बहुत अच्छा होगा (: – Rubens

+0

@ रूबेन्स: - क्या यह अब मदद करता है ?? –

+1

+1 मेरा मतलब यह नहीं था कि आपकी पोस्ट में मदद नहीं मिली! ^^ कार्यात्मक उदाहरण के लिए धन्यवाद! (: – Rubens

2

आप बस एक डमी चर

int first, second; 
std::string dummy; 
cin >> first >> dummy >> second; 

उपयोग कर सकते हैं, लेकिन कोई प्रत्यक्ष समकक्ष AFAIK वहाँ है।

+0

हां, यही कारण है कि मैंने " * बेशक, अतिरिक्त वर्रों के उपयोग को कम करना * "। मैं इस एकमात्र समाधान के विचार के लिए उपयोग कर रहा हूं, वैसे भी \ = – Rubens

+0

@ रूबेन्स, क्षमा करें, इसे याद किया। – john

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