2012-11-01 11 views
17

द्वारा विभाजित स्ट्रिंग को लाइन द्वारा स्ट्रिंग को विभाजित करने की आवश्यकता है। मैं निम्नलिखित तरीके से करते थे: "।। \ Nyes हम कर रहे हैं हम एक हैं"सी ++ लाइन

int doSegment(char *sentence, int segNum) 
{ 
assert(pSegmenter != NULL); 
Logger &log = Logger::getLogger(); 
char delims[] = "\n"; 
char *line = NULL; 
if (sentence != NULL) 
{ 
    line = strtok(sentence, delims); 
    while(line != NULL) 
    { 
     cout << line << endl; 
     line = strtok(NULL, delims); 
    } 
} 
else 
{ 
    log.error("...."); 
} 
return 0; 
} 

मैं इनपुट और doSegment विधि का आह्वान करें। लेकिन जब मैं डिबगिंग करता हूं, तो मुझे वाक्य पैरामीटर मिलता है "हम एक हैं। \\ nyes हम हैं", और विभाजन विफल हो गया। क्या कोई मुझे बता सकता है कि ऐसा क्यों हुआ और मुझे क्या करना चाहिए। क्या वैसे भी मैं सी ++ में स्ट्रिंग को विभाजित करने के लिए उपयोग कर सकता हूं। धन्यवाद !

+2

मैं वास्तविक ग उपयोग करने का सुझाव ++ - एसटीडी पर एक नज़र :: getline –

+1

आप निवेश के बारे में कुछ परिवर्तन करने की आवश्यकता है। विभाजित समारोह नहीं। – halfelf

+0

'स्ट्रोकोक' से सावधान रहें क्योंकि यह उस स्ट्रिंग को संशोधित करता है जिसे आप पास करते हैं। –

उत्तर

35

मैं स्ट्रिंग के माध्यम से जाने के लिए std :: getline या std :: string :: ढूंढना चाहता हूं। कोड के नीचे प्रदर्शित करता है कि getline समारोह

int doSegment(char *sentence) 
{ 
    std::stringstream ss(sentence); 
    std::string to; 

    if (sentence != NULL) 
    { 
    while(std::getline(ss,to,'\n')){ 
     cout << to <<endl; 
    } 
    } 

return 0; 
} 
+0

एक और सवाल। मुझे यकीन नहीं था कि स्ट्रिंगस्ट्रीम को बंद करने की आवश्यकता है या नहीं। – wangzhiju

+4

यह स्थानीय चर है, यदि यह निष्पादन से बाहर हो जाता है तो यह स्वयं को नष्ट कर देगा। – billz

9

आप लूप में std::string::find पर कॉल कर सकते हैं और std::string::substr का उपयोग कर सकते हैं।

std::vector<std::string> split_string(const std::string& str, 
             const std::string& delimiter) 
{ 
    std::vector<std::string> strings; 

    std::string::size_type pos = 0; 
    std::string::size_type prev = 0; 
    while ((pos = str.find(delimiter, prev)) != std::string::npos) 
    { 
     strings.push_back(str.substr(prev, pos - prev)); 
     prev = pos + 1; 
    } 

    // To get the last substring (or only, if delimiter is not found) 
    strings.push_back(str.substr(prev)); 

    return strings; 
} 

उदाहरण देखें here

+3

यदि आप एक डेलीमीटर का उपयोग कर रहे हैं जिसमें एक से अधिक वर्ण हैं, जैसे मैं हूं, तो आप "prev = pos + 1;" को बदलना चाहेंगे लाइन "prev = pos + delimiter.size();" बजाय। अन्यथा, आपके पास वेक्टर में अगले तत्व की शुरुआत में शेष वर्ण शेष रहेंगे। –

0
#include <iostream> 
#include <string> 
#include <regex> 
#include <algorithm> 
#include <iterator> 

using namespace std; 


vector<string> splitter(string in_pattern, string& content){ 
    vector<string> split_content; 

    regex pattern(in_pattern); 
    copy(sregex_token_iterator(content.begin(), content.end(), pattern, -1), 
    sregex_token_iterator(),back_inserter(split_content)); 
    return split_content; 
} 

int main() 
{ 

    string sentence = "This is the first line\n"; 
    sentence += "This is the second line\n"; 
    sentence += "This is the third line\n"; 

    vector<string> lines = splitter(R"(\n)", sentence); 

    for (string line: lines){cout << line << endl;} 

} 

// 1) We have a string with multiple lines 
// 2) we split those into an array (vector) 
// 3) We print out those elements in a for loop 


// My Background. . . 
// github.com/Radicalware 
// Radicalware.net 
// https://www.youtube.com/channel/UCivwmYxoOdDT3GmDnD0CfQA/playlists 
+0

हालांकि यह कोड स्निपेट समाधान हो सकता है, [एक स्पष्टीकरण सहित] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answer) वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और वे लोग आपके कोड सुझाव के कारणों को नहीं जानते हैं। – peacetype

+0

यदि आप नीचे स्क्रॉल करते हैं तो आपको कोड में टिप्पणियां दिखाई देगी। स्टैक ओवरफ़्लो मुझे किसी कारण से कोड ब्लॉक के बाहर टेक्स्ट रखने नहीं देगा। – Scourge

+0

// 1) हमारे पास एकाधिक लाइन // 2 के साथ एक स्ट्रिंग है) हम उन्हें एक सरणी (वेक्टर) // 3 में विभाजित करते हैं) हम उन तत्वों को लूप में प्रिंट करते हैं – Scourge

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