2013-01-15 12 views
14

scanf के साथ वहाँ है, आम तौर पर, स्वरूपित इनपुट लेने के लिए एक सीधा रास्ता:स्कैनफ स्वरूपित इनपुट के सिने एनालॉगस क्या है?

1) 0 से अधिक एक वास्तविक संख्या के साथ लाइन, और कम से कम 1. 'एक्स' पर समाप्त, जैसे: 0.32432523x

30 + 28 = अट्ठावन

scanf(":%d+%d=%99s", &number1, &number2, &total); 

क्या CIN समाधान है केवल स्टैंड का उपयोग कर:

scanf("0.%[0-9]x", &number); 

2) लाइन प्रारूप में एक अतिरिक्त का प्रतिनिधित्व करता है ard पुस्तकालय?

+2

कहीं नहीं * के पास * के रूप में सुंदर ... 'scanf' वास्तव में शक्तिशाली है। निजी तौर पर, मैंने 'स्ट्रिंग' में पढ़ा है, पॉइंटर को 'स्ट्रिंग :: c_str() 'और फिर' sscanf' 'के माध्यम से पकड़ें। या मैं इसे 'स्ट्रिंगस्ट्रीम' या जो भी हो, से खुद को समझता हूं। – paddy

+1

सी ++ में इस तरह के स्वरूपित इनपुट के लिए, आप कुछ [बूस्ट स्पिरिट] (http://boost-spirit.com/home/) पर विचार करना चाहेंगे। यह अधिक हो सकता है, लेकिन यह सीधे iostreams का उपयोग करने से क्लीनर होगा। –

+1

स्कैनफ़ को इस पर जीत मिलती है क्योंकि यह आपको एक रिटर्न वैल्यू देता है जिसे आप मिलान की गई सभी चीज़ों को सत्यापित करने के लिए एक ही स्थान पर देख सकते हैं। सीन स्ट्रीम में आपको कुछ चीजें "मैन्युअल रूप से" जांचनी होगी। – doug65536

उत्तर

5

>> सेन से पढ़ने के लिए >> ऑपरेटर का उपयोग करें।

int number1, number2; 
    std::string text; 
    char plus, equals; 
    std::cin >> number1 >> plus >> number2 >> equals >> text; 
    if (!std::cin.fail() && plus == '+' && equals == '=' && !text.empty()) 
    std::cout << "matched"; 

यह स्कैनफ़ के जितना अच्छा नहीं है क्योंकि आपको स्कैनफ स्ट्रिंग में स्वयं के किसी भी अक्षर को सत्यापित करना होगा। धाराओं के साथ ऐसा करना निश्चित रूप से स्कैनफ की तुलना में कोड की बहुत अधिक पंक्तियां होगी।

मैं स्कैनफ़ का उपयोग करूंगा।

+1

'cin.fail()' का उपयोग करें, 'cin.bad() 'या' सिनि 'के रूप में सीधे' cin' का उपयोग करें। –

+0

मैंने इसे खराब() से असफल() में बदल दिया है। अच्छा निर्णय। – doug65536

6

आप इनपुट सत्यापित करने के लिए एक साधारण कक्षा बना सकते हैं।

struct confirm_input { 
    char const *str; 

    confirm_input(char const *in) : str(in) {} 

    friend std::istream &operator >> 
     (std::istream &s, confirm_input const &o) { 

     for (char const *p = o.str; * p; ++ p) { 
      if (std::isspace(* p)) { 
       std::istream::sentry k(s); // discard whitespace 
      } else if ((c = s.get()) != * p) { 
       s.setstate(std::ios::failbit); // stop extracting 
      } 
     } 
     return s; 
    } 
}; 

उपयोग:

std::cin >> x >> confirm_input(" = ") >> y; 
+0

बहुत अच्छा। विचार बहुत लचीला है, आप इस तरह एक वस्तु में सही पार्स कर सकते हैं। – doug65536

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