2010-02-16 13 views
12

संभावित डुप्लिकेट खाली स्थान के द्वारा एक स्ट्रिंग:
C++: How to split a string?
Splitting a stringविभाजन C++

अप ग में खाली स्थान के द्वारा एक स्ट्रिंग बंटवारे के बारे में जाने के लिए सबसे अच्छा तरीका क्या है ++?

मैं इसे टैब, स्पेस इत्यादि के आधार पर विभाजित करने में सक्षम होना चाहता हूं और निश्चित रूप से कई टैब/रिक्त स्थान/आदि को अनदेखा कर सकता हूं। एक पंक्ति में साथ ही साथ अंत में उन चीजों को रखने में समस्याएं नहीं हैं।

आखिरकार, मैं इसे एक वेक्टर में संग्रहीत करने जा रहा हूं, लेकिन यदि विभाजन के कुछ आसान अंतर्निहित मानक लाइब्रेरी तरीके हैं तो मैं आसानी से डेटा प्रकारों के बीच परिवर्तित कर सकता हूं।

मैं जी के साथ एक यूनिक्स मशीन ++ पर इस निर्माण कर रहा हूँ, नहीं माइक्रोसॉफ्ट विज़ुअल सी ++

+2

देखें: http://stackoverflow.com/questions/236129/c-how-to-split-a-string – kennytm

+2

और http://stackoverflow.com/questions/909289/splitting-a-string – Potatoswatter

+5

यह प्रश्न मुझे एहसास हुआ कि कितना पायथन मेरे जीवन को आसान बना देता है। – dassouki

उत्तर

11

का उपयोग कर यह अच्छी तरह से इस विशेष समस्या के लिए overkill हो सकता है लेकिन Boost.Regex पर विचार करें।

(ईमानदारी से, मैं शायद एक स्क्रिप्ट लिख सकता हूं जो 'बूस्ट' के साथ SO पर प्रत्येक सी ++ प्रश्न का जवाब देता है, और कर्म में आगे आ जाता है। लेकिन यह वास्तव में मदद करता है)।

+3

+1। इसके लिए आपको बढ़े हुए प्रतिनिधि के बिना छोड़ नहीं सका। –

+1

मुझे एहसास हुआ कि यह बहुत समय पहले पोस्ट किया गया था, लेकिन मुझे टिप्पणी करने का आग्रह था। मुझे नहीं पता कि हर कोई मेरे जैसा है, लेकिन मुझे पहिया को दोबारा बनाना पसंद है ... कभी-कभी मुझे पूछे जाने वाले प्रश्नों के उत्तर मिलते हैं, जो कहते हैं कि बूस्ट का उपयोग करें, लेकिन मैं जानना चाहता हूं कि क्यों या कैसे काम करता है, और इसे कैसे कार्यान्वित किया जाए। निश्चित रूप से, यदि आपको उत्पाद को तेजी से शिप करना है, क्योंकि फीचर्स बूस्ट प्रदान करने से पहले से ही परीक्षण और विश्वसनीय हैं, यह निश्चित रूप से एक अच्छा विकल्प है। हालांकि, अगर आपके पास यह जानने के लिए समय है कि उन सुविधाओं को कैसे कार्यान्वित किया जाए, तो यह आपको एक अमूल्य कौशल सेट प्रदान करता है। तो - उस स्क्रिप्ट को न बनाएं;) जब तक जरूरी न हो। –

+0

यही कारण है कि मैंने कभी भी उत्तर देने वाले उत्तरों को कभी भी वोट नहीं दिया। –

15

यह सवाल है कि क्या यह सबसे अच्छा, लेकिन एक सच में आसान तरीका यह है है एक stringstream में अपने स्ट्रिंग डाल करने के लिए है, और फिर बाहर हो डेटा पढ़ने के लिए खुला हो सकता है:

// warning: untested code. 
std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret; 

    std::copy(std::istream_iterator<std::string>(buffer), 
       std::istream_iterator<std::string>(), 
       std::back_inserter(ret)); 
    return ret; 
} 

हैं आप चाहें तो आप iterators से सीधे vector प्रारंभ कर सकते हैं:

std::vector<std::string> split(std::string const &input) { 
    std::istringstream buffer(input); 
    std::vector<std::string> ret((std::istream_iterator<std::string>(buffer)), 
           std::istream_iterator<std::string>()); 
    return ret; 
} 

या तो किसी भी उचित सी ++ संकलक के साथ काम करना चाहिए। साथ सी ++ 11, आप के बजाय ब्रेस-आरंभीकरण का उपयोग करके एक छोटा सा दूसरे संस्करण को साफ कर सकते हैं:

std::vector<std::string> ret{std::istream_iterator<std::string>(buffer), 
           std::istream_iterator<std::string>()}; 
+0

मैं 'std :: istringstream' पसंद करूंगा, लेकिन अन्यथा यह अच्छा है। एक डिलीमीटर पैरामीटर जोड़ने के लिए +1 – sbi

7

यह मैं क्या उपयोग है:

/* Tokenizing a string */ 
    std::vector<std::string> Parser::tokenizer(const std::string& p_pcstStr, char delim) { 
     std::vector<std::string> tokens; 
     std::stringstream mySstream(p_pcstStr); 
     std::string   temp; 

     while(getline(mySstream, temp, delim)) { 
      tokens.push_back(temp); 
     } 

     return tokens; 
    } 

आपका परिसीमक एक खाली स्थान के हो सकता है, p_pcstStr टोकननाइज़ करने के लिए स्ट्रिंग होगा और वापसी सभी तारों के साथ एक वेक्टर होगी जिसमें बीच में एक सफेद जगह होगी।

+2

+ 1 – crocboy

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