2009-06-23 15 views
24

मुझे एक समस्या है जो sscanf हल करता है (स्ट्रिंग से चीजों को निकालने)। मुझे sscanf पसंद नहीं है हालांकि यह टाइप-सुरक्षित नहीं है और पुराना और भयानक है। मैं चालाक होना चाहता हूं और सी ++ मानक पुस्तकालय के कुछ और आधुनिक भागों का उपयोग करना चाहता हूं। इसके बजाय मुझे क्या उपयोग करना चाहिए?एसएसकेएनएफ के बजाय मुझे क्या उपयोग करना चाहिए?

+2

"चालाक" होने के लिए क्यों की कोशिश:

आप मूर्खता में इसके कार्यान्वयन मिल सकती है? –

+11

उदाहरण के लिए उन्होंने कहा कि, sscanf टाइप-सुरक्षित नहीं है। – jalf

+5

@ कालेब पेडरसन: कई अंग्रेजी बोलने वालों के लिए, "चालाक" का अर्थ केवल "स्मार्ट" हो सकता है और इसका कभी-कभी नकारात्मक अर्थ नहीं होता है। ध्यान दें कि बेन हैमर ब्रिटेन से हैं। – Naaff

उत्तर

36

मुझे लगता है कि अन्य उत्तर बात को अनदेखा कर रहे हैं। प्रश्न I/O के बारे में नहीं है, यह एक स्ट्रिंग से डेटा निकालने के बारे में है।

कोशिश stringstream:

#include <sstream> 

... 

std::stringstream s("123 456 789"); 
int a, b, c; 
s >> a >> b >> c; 
+0

सी कैसे नहीं है, उदाहरण के लिए स्ट्रिंग "123 456" थी? – unludo

+0

@unludo: उस स्थिति में, 'सी' को बिना संहिताबद्ध किया जाएगा। आप 'c' को डिफ़ॉल्ट मान के साथ प्रारंभ कर सकते हैं, या आपको अधिक परिष्कृत पार्सिंग की आवश्यकता हो सकती है। एक टोकनेज़र शायद काम करेगा। –

+1

सी ++ 11 के रूप में, 'c' को' 0' पर रीसेट कर दिया जाएगा, और इससे पहले मुझे विश्वास है कि इसके बाद विफलता मान को परिभाषित किया गया था। वैसे भी, यह जांचने के लिए कि क्या 'सी' धारा राज्य का उपयोग करता है (सुविधा के लिए, 'ऑपरेटर बूल()' से): 'अगर (एस >> ए >> बी) यदि (एस >> सी) abc_there(); अन्य ab_there(); else didnt_have_a_and_b(); '। –

2

आप sstream शामिल करते हैं तो आप stringstream वर्गों है कि तार के लिए धाराओं प्रदान करते हैं जो कि तुम क्या जरूरत है का लाभ उठा सकेंगे। Roguewave, कुछ अच्छी examples on how to use it.

5

सबसे नौकरियों मानक धाराओं काम पूरी तरह से करते है

std::string data = "AraK 22 4.0"; 
std::stringstream convertor(data); 
std::string name; 
int age; 
double gpa; 

convertor >> name >> age >> gpa; 

if(convertor.fail() == true) 
{ 
    // if the data string is not well-formatted do what ever you want here 
} 

आप और अधिक जटिल पार्स के लिए और अधिक शक्तिशाली उपकरण की जरूरत है, तो आप बूस्ट से Regex या यहाँ तक कि आत्मा विचार कर सकते हैं।

0

यदि आप वास्तव में धाराओं का उपयोग नहीं करना चाहते हैं (यह पठनीयता की वजह से अच्छा है), तो आप स्ट्रिंगप्रिंटफ़ का उपयोग कर सकते हैं।

https://github.com/facebook/folly/blob/master/folly/String.h#L165

+0

कोड का अच्छा सा हिस्सा (मैं लगभग पहले से ही कुछ उपयोग कर रहा हूं), हालांकि यह 'sscanf' की बजाय' printf' के प्रतिस्थापन है। –

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