पार्स (विभाजित) स्ट्रिंग सीमांकक (मानक C ++) का उपयोग करके C ++ में एक स्ट्रिंग


360

मैं निम्नलिखित का उपयोग करके C ++ में एक स्ट्रिंग पार्स कर रहा हूं:

using namespace std;

string parsed,input="text to be parsed";
stringstream input_stringstream(input);

if (getline(input_stringstream,parsed,' '))
{
     // do some processing.
}

एकल चार सीमांकक के साथ पार्सिंग ठीक है। लेकिन क्या होगा अगर मैं एक स्ट्रिंग को सीमांकक के रूप में उपयोग करना चाहता हूं।

उदाहरण: मैं विभाजित करना चाहता हूं:

scott>=tiger

साथ >=परिसीमक के रूप में तो यह है कि मैं स्कॉट और बाघ मिल सकती है।

जवाबों:


573

आप std::string::find()अपने स्ट्रिंग सीमांकक की स्थिति का पता लगाने के लिए फ़ंक्शन का उपयोग कर सकते हैं , फिर std::string::substr()टोकन प्राप्त करने के लिए उपयोग कर सकते हैं।

उदाहरण:

std::string s = "scott>=tiger";
std::string delimiter = ">=";
std::string token = s.substr(0, s.find(delimiter)); // token is "scott"
  • find(const string& str, size_t pos = 0)समारोह की पहली आवृत्ति की स्थिति रिटर्न strस्ट्रिंग में, या nposअगर स्ट्रिंग नहीं मिला है।

  • substr(size_t pos = 0, size_t n = npos)समारोह वस्तु की सबस्ट्रिंग देता है, स्थिति पर शुरू posऔर लंबाई के npos


यदि आपके पास एक से अधिक टोकन हैं, तो एक टोकन निकालने के बाद, आप बाद के निष्कर्षों के साथ आगे बढ़ने के लिए इसे हटा सकते हैं (सीमांकित शामिल) (यदि आप मूल स्ट्रिंग को संरक्षित करना चाहते हैं, तो बस उपयोग करें s = s.substr(pos + delimiter.length());):

s.erase(0, s.find(delimiter) + delimiter.length());

इस तरह से आप प्रत्येक टोकन प्राप्त करने के लिए आसानी से लूप कर सकते हैं।

पूरा उदाहरण

std::string s = "scott>=tiger>=mushroom";
std::string delimiter = ">=";

size_t pos = 0;
std::string token;
while ((pos = s.find(delimiter)) != std::string::npos) {
    token = s.substr(0, pos);
    std::cout << token << std::endl;
    s.erase(0, pos + delimiter.length());
}
std::cout << s << std::endl;

आउटपुट:

scott
tiger
mushroom

66
जो लोग इनपुट स्ट्रिंग को संशोधित नहीं करना चाहते हैं, उनके लिएsize_t last = 0; size_t next = 0; while ((next = s.find(delimiter, last)) != string::npos) { cout << s.substr(last, next-last) << endl; last = next + 1; } cout << s.substr(last) << endl;
5

30
नोट: mushroomलूप के बाहर आउटपुट, यानीs = mushroom
डॉन लैरींक्स

1
वे नमूने स्ट्रिंग से अंतिम टोकन नहीं निकालते हैं। एक स्ट्रिंग से एक IPV4 निकालने वाले खान का एक नमूना: <code> size_t last = 0; size_t next = 0; int index = 0; जबकि (सूचकांक <4) {अगला = str.find (सीमांकक, अंतिम); ऑटो नंबर = str.substr (अंतिम, अगला - अंतिम); IPv4 [सूचकांक ++] = atoi (number.c_str ()); अंतिम = अगला + 1; } </ code>
rfog

2
@ hayk.mart बस एक नोट, जो निम्नलिखित होगा, आपको सीमांकक के आकार के कारण 2 नहीं 1 जोड़ने की आवश्यकता है जो कि 2 वर्ण है :): std :: string s = "scott> = tiger> = मशरूम"; std :: string delimiter = "> ="; size_t last = 0; size_t next = 0; जबकि (अगला (s = s.find (अंतिम, अंतिम))! = std :: string :: npos) {std :: cout << s.substr (अंतिम, अगला-अंतिम) << std :: endl; अंतिम = अगला + 2; } std :: cout << s.substr (अंतिम) << std :: endl;
ervinbosenbacher

"टाइगर" प्राप्त करने के लिए, उपयोग करें std::string token = s.substr(s.find(delimiter) + 1);, यदि आप सुनिश्चित हैं कि यह मौजूद है (मैं लंबाई में +1 का उपयोग करता हूं) ...
gsamaras

64

यह विधि std::string::findपिछले स्ट्रिंग टोकन की शुरुआत और अंत को याद करके मूल स्ट्रिंग को म्यूट किए बिना उपयोग करती है ।

#include <iostream>
#include <string>

int main()
{
    std::string s = "scott>=tiger";
    std::string delim = ">=";

    auto start = 0U;
    auto end = s.find(delim);
    while (end != std::string::npos)
    {
        std::cout << s.substr(start, end - start) << std::endl;
        start = end + delim.length();
        end = s.find(delim, start);
    }

    std::cout << s.substr(start, end);
}

34

स्ट्रिंग को विभाजित करने के लिए आप अगले फ़ंक्शन का उपयोग कर सकते हैं:

vector<string> split(const string& str, const string& delim)
{
    vector<string> tokens;
    size_t prev = 0, pos = 0;
    do
    {
        pos = str.find(delim, prev);
        if (pos == string::npos) pos = str.length();
        string token = str.substr(prev, pos-prev);
        if (!token.empty()) tokens.push_back(token);
        prev = pos + delim.length();
    }
    while (pos < str.length() && prev < str.length());
    return tokens;
}

5
IMO यह अपेक्षित रूप से काम नहीं करता है: split("abc","a")एक वेक्टर या एक स्ट्रिंग लौटाएगा "bc", जहां मुझे लगता है कि यह तत्वों की एक वेक्टर वापस कर दिया गया था तो यह अधिक समझ में आएगा ["", "bc"]str.split()पायथन में उपयोग करना , यह मेरे लिए सहज था कि इसे खाली स्ट्रिंग लौटाया जाए delimया तो शुरुआत में या अंत में पाया गया, लेकिन यह सिर्फ मेरी राय है। वैसे भी, मुझे लगता है कि इसका उल्लेख किया जाना चाहिए
kyriakosSt

1
if (!token.empty()) @KyriakosSt द्वारा उल्लिखित समस्या के निवारण के साथ-साथ लगातार परिसीमन से जुड़े अन्य मुद्दों को भी जोरदार तरीके से हटाने की सिफारिश करेंगे।
स्टीव

1
अगर मैं कर सकता तो मैं अपने अपवोट को हटा देता, लेकिन एसओ मुझे नहीं जाने देता। @KyriakosSt द्वारा लाया गया मुद्दा एक समस्या है, और इसे हटाने के if (!token.empty())लिए इसे ठीक करने के लिए पर्याप्त नहीं लगता है।
bhaller

1
@bhaller इस स्निपलेट को खाली टुकड़ों को छोड़ने के लिए डिज़ाइन किया गया था। यदि आपको खाली रखने की आवश्यकता है तो मुझे डर है कि आपको एक और विभाजन कार्यान्वयन लिखने की आवश्यकता है। कृपया सुझाव दें कि आप इसे कॉम्युनिटी की भलाई के लिए यहाँ पोस्ट करें।
२lav

32

स्ट्रिंग सीमांकक के लिए

एक स्ट्रिंग सीमांकक के आधार पर विभाजित स्ट्रिंग । जैसे "adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih"स्ट्रींग डिमाइटर पर आधारित स्प्लिटिंग स्ट्रिंग "-+", आउटपुट होगा{"adsf", "qwret", "nvfkbdsj", "orthdfjgh", "dfjrleih"}

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

// for string delimiter
vector<string> split (string s, string delimiter) {
    size_t pos_start = 0, pos_end, delim_len = delimiter.length();
    string token;
    vector<string> res;

    while ((pos_end = s.find (delimiter, pos_start)) != string::npos) {
        token = s.substr (pos_start, pos_end - pos_start);
        pos_start = pos_end + delim_len;
        res.push_back (token);
    }

    res.push_back (s.substr (pos_start));
    return res;
}

int main() {
    string str = "adsf-+qwret-+nvfkbdsj-+orthdfjgh-+dfjrleih";
    string delimiter = "-+";
    vector<string> v = split (str, delimiter);

    for (auto i : v) cout << i << endl;

    return 0;
}


उत्पादन

adsf
qwret
nvfkbdsj
orthdfjgh
dfjrleih




एकल चरित्र परिसीमन के लिए

स्प्लिट स्ट्रिंग एक चरित्र सीमांकक पर आधारित है। जैसे "adsf+qwer+poui+fdgh"सीमांकक के साथ विभाजन स्ट्रिंग "+"का उत्पादन होगा{"adsf", "qwer", "poui", "fdg"h}

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

vector<string> split (const string &s, char delim) {
    vector<string> result;
    stringstream ss (s);
    string item;

    while (getline (ss, item, delim)) {
        result.push_back (item);
    }

    return result;
}

int main() {
    string str = "adsf+qwer+poui+fdgh";
    vector<string> v = split (str, '+');

    for (auto i : v) cout << i << endl;

    return 0;
}


उत्पादन

adsf
Qwer
poui
fdgh

आप vector<string>मुझे बता रहे हैं कि इसे कॉपी कंस्ट्रक्टर कहेंगे।
मयूर

2
मेरे द्वारा देखे गए प्रत्येक संदर्भ से पता चलता है कि कॉपी कंस्ट्रक्टर को कॉल उस संदर्भ में समाप्त हो गया है।
डेविड

"आधुनिक" (C ++ 03?) कम्पाइलर्स के साथ मेरा मानना ​​है कि यह सही है, आरवीओ और / या मूवमेंट्स कॉपीराइटर को खत्म कर देंगे।
केविन

मैंने एकल चरित्र सीमांकक के लिए एक की कोशिश की, और यदि स्ट्रिंग एक सीमांकक में समाप्त होता है (यानी, लाइन के अंत में एक खाली सीएसवी कॉलम), तो यह खाली स्ट्रिंग वापस नहीं करता है। यह केवल एक कम स्ट्रिंग लौटाता है। उदाहरण के लिए: 1,2,3,4 \ n, B, C,
kounoupis

मैंने स्ट्रिंग सीमांकक के लिए भी प्रयास किया, और यदि स्ट्रिंग एक सीमांकक में समाप्त होता है, तो अंतिम सीमांकक पिछले स्ट्रिंग के हिस्से को निकाला जाता है।
kounoupis

19

यह कोड टेक्स्ट से लाइनों को विभाजित करता है, और सभी को वेक्टर में जोड़ता है।

vector<string> split(char *phrase, string delimiter){
    vector<string> list;
    string s = string(phrase);
    size_t pos = 0;
    string token;
    while ((pos = s.find(delimiter)) != string::npos) {
        token = s.substr(0, pos);
        list.push_back(token);
        s.erase(0, pos + delimiter.length());
    }
    list.push_back(s);
    return list;
}

के द्वारा बुलाया गया:

vector<string> listFilesMax = split(buffer, "\n");

यह बहुत अच्छा काम कर रहा है! मैंने सूची जोड़ी है। push_back (s); क्योंकि यह गायब था।
स्टोइका मिसेया

1
यह स्ट्रिंग के अंतिम भाग को याद करता है। लूप समाप्त होने के बाद, हमें शेष को नए टोकन के रूप में जोड़ना होगा।
व्हिहाटक

मैंने अनुपलब्ध पुश_बैक को ठीक करने के लिए कोड नमूने का संपादन किया है।
झल्लाहट

1
यह अधिक अच्छा होगाvector<string> split(char *phrase, const string delimiter="\n")
मयूर

15

strtok आपको कई चार्ट में सीमांकक के रूप में पारित करने की अनुमति देता है। मैं शर्त लगाता हूं कि यदि आप "> =" में उत्तीर्ण हुए हैं, तो आपका उदाहरण स्ट्रिंग सही ढंग से विभाजित हो जाएगा (भले ही> और = को व्यक्तिगत भ्रम के रूप में गिना जाता है)।

संपादित करें आप का उपयोग नहीं करना चाहते हैं, तो c_str()चार * करने के लिए स्ट्रिंग से परिवर्तित करने के लिए, आप उपयोग कर सकते हैं substr और find_first_of को tokenize।

string token, mystring("scott>=tiger");
while(token != mystring){
  token = mystring.substr(0,mystring.find_first_of(">="));
  mystring = mystring.substr(mystring.find_first_of(">=") + 1);
  printf("%s ",token.c_str());
}

3
धन्यवाद। लेकिन मैं केवल C ++ का उपयोग करना चाहता हूं और किसी भी C फ़ंक्शन का उपयोग नहीं करना चाहता strtok()क्योंकि इसमें मुझे स्ट्रिंग के बजाय चार सरणी का उपयोग करने की आवश्यकता होगी।
theCrazyProgrammer

2
@ TheCrazyProgrammer तो? यदि कोई सी फ़ंक्शन करता है जो आपको चाहिए, तो इसका उपयोग करें। यह एक ऐसी दुनिया नहीं है जहाँ C ++ में C फ़ंक्शन उपलब्ध नहीं हैं (वास्तव में, उन्हें होना चाहिए)। .c_str()सस्ता है और आसान भी है।
Qix - MONICA WAS ने

1
अगर (टोकेन! = मिस्ट्री) के लिए चेक आपके स्ट्रिंग में तत्वों को दोहराता है तो गलत परिणाम देता है। मैंने आपके कोड का उपयोग एक संस्करण बनाने के लिए किया है जिसमें यह नहीं है। इसमें कई बदलाव हैं जो उत्तर को मौलिक रूप से बदलते हैं, इसलिए मैंने संपादन के बजाय अपना स्वयं का उत्तर लिखा। इसे नीचे देखें।
अंबर एलिफिंक

5

यहाँ मेरा इस पर ले रहा है। यह किनारे के मामलों को संभालता है और परिणामों से रिक्त प्रविष्टियों को हटाने के लिए एक वैकल्पिक पैरामीटर लेता है।

bool endsWith(const std::string& s, const std::string& suffix)
{
    return s.size() >= suffix.size() &&
           s.substr(s.size() - suffix.size()) == suffix;
}

std::vector<std::string> split(const std::string& s, const std::string& delimiter, const bool& removeEmptyEntries = false)
{
    std::vector<std::string> tokens;

    for (size_t start = 0, end; start < s.length(); start = end + delimiter.length())
    {
         size_t position = s.find(delimiter, start);
         end = position != string::npos ? position : s.length();

         std::string token = s.substr(start, end - start);
         if (!removeEmptyEntries || !token.empty())
         {
             tokens.push_back(token);
         }
    }

    if (!removeEmptyEntries &&
        (s.empty() || endsWith(s, delimiter)))
    {
        tokens.push_back("");
    }

    return tokens;
}

उदाहरण

split("a-b-c", "-"); // [3]("a","b","c")

split("a--c", "-"); // [3]("a","","c")

split("-b-", "-"); // [3]("","b","")

split("--c--", "-"); // [5]("","","c","","")

split("--c--", "-", true); // [1]("c")

split("a", "-"); // [1]("a")

split("", "-"); // [1]("")

split("", "-", true); // [0]()

4

यह स्ट्रिंग (या एकल वर्ण) सीमांकक के लिए पूरी तरह से काम करना चाहिए। शामिल करने के लिए मत भूलना #include <sstream>

std::string input = "Alfa=,+Bravo=,+Charlie=,+Delta";
std::string delimiter = "=,+"; 
std::istringstream ss(input);
std::string token;
std::string::iterator it;

while(std::getline(ss, token, *(it = delimiter.begin()))) {
    while(*(++it)) ss.get();
    std::cout << token << " " << '\n';
}

पहली बार जब लूप स्ट्रिंग सीमांकक के पहले चरित्र का उपयोग करके एक टोकन निकालता है। दूसरा जबकि लूप बाकी सीमांकक को छोड़ देता है और अगले टोकन की शुरुआत में रुक जाता है।


3

मैं उपयोग करूंगा boost::tokenizer। यहां एक उपयुक्त टोकन फ़ंक्शन करने का तरीका बताने वाले दस्तावेज़ हैं: http://www.boost.org/doc/libs/1_52_0/libs/tokenizer/tokenizerfunction.htm

यहाँ एक है जो आपके मामले के लिए काम करता है।

struct my_tokenizer_func
{
    template<typename It>
    bool operator()(It& next, It end, std::string & tok)
    {
        if (next == end)
            return false;
        char const * del = ">=";
        auto pos = std::search(next, end, del, del + 2);
        tok.assign(next, pos);
        next = pos;
        if (next != end)
            std::advance(next, 2);
        return true;
    }

    void reset() {}
};

int main()
{
    std::string to_be_parsed = "1) one>=2) two>=3) three>=4) four";
    for (auto i : boost::tokenizer<my_tokenizer_func>(to_be_parsed))
        std::cout << i << '\n';
}

3
धन्यवाद। लेकिन मैं केवल मानक सी ++ और तीसरे पक्ष के पुस्तकालय की इच्छा करना चाहता हूं।
theCrazyProgrammer

@ TheCrazyProgrammer: ठीक है, जब मैंने "मानक C ++" पढ़ा, तो मैंने सोचा कि इसका कोई गैर-मानक एक्सटेंशन नहीं है, यह नहीं कि आप तीसरे पक्ष के पुस्तकालयों के अनुरूप मानकों का उपयोग नहीं कर सकते।
बेंजामिन लिंडले

3

उत्तर पहले से ही मौजूद है, लेकिन चयनित-उत्तर इरेज़ फ़ंक्शन का उपयोग करता है जो बहुत महंगा है, कुछ बहुत बड़े स्ट्रिंग (एमबीएस में) के बारे में सोचें। इसलिए मैं नीचे फ़ंक्शन का उपयोग करता हूं।

vector<string> split(const string& i_str, const string& i_delim)
{
    vector<string> result;

    size_t found = i_str.find(i_delim);
    size_t startIndex = 0;

    while(found != string::npos)
    {
        string temp(i_str.begin()+startIndex, i_str.begin()+found);
        result.push_back(temp);
        startIndex = found + i_delim.size();
        found = i_str.find(i_delim, startIndex);
    }
    if(startIndex != i_str.size())
        result.push_back(string(i_str.begin()+startIndex, i_str.end()));
    return result;      
}

मैंने इसका परीक्षण किया, और यह काम करता है। धन्यवाद! मेरी राय में, यह सबसे अच्छा जवाब है क्योंकि मूल उत्तर-एर राज्यों के रूप में, यह समाधान मेमोरी ओवरहेड को कम करता है, और परिणाम आसानी से एक वेक्टर में संग्रहीत होता है। (अजगर string.split()विधि की नकल करता है ।)
रॉबी कैप्स

2

यह एक पूर्ण विधि है जो किसी भी सीमांकक पर स्ट्रिंग को विभाजित करती है और कटा हुआ तार के एक वेक्टर को वापस करती है।

यह ryanbwork से जवाब से एक अनुकूलन है। हालांकि, उसके लिए चेक: if(token != mystring)गलत परिणाम देता है यदि आपके पास अपने स्ट्रिंग में दोहराए जाने वाले तत्व हैं। यह मेरी उस समस्या का समाधान है।

vector<string> Split(string mystring, string delimiter)
{
    vector<string> subStringList;
    string token;
    while (true)
    {
        size_t findfirst = mystring.find_first_of(delimiter);
        if (findfirst == string::npos) //find_first_of returns npos if it couldn't find the delimiter anymore
        {
            subStringList.push_back(mystring); //push back the final piece of mystring
            return subStringList;
        }
        token = mystring.substr(0, mystring.find_first_of(delimiter));
        mystring = mystring.substr(mystring.find_first_of(delimiter) + 1);
        subStringList.push_back(token);
    }
    return subStringList;
}

1
कुछ while (true)इस तरह कोड के एक टुकड़े में देखने के लिए आमतौर पर डरावना है। व्यक्तिगत रूप से मैं इसे फिर से लिखने की सलाह दूंगा ताकि तुलना std::string::npos(या क्रमशः एक चेक के खिलाफ mystring.size()) while (true)अप्रचलित हो जाए।
जोएल बोडेनमैन 16

1

यदि आप स्ट्रिंग को संशोधित नहीं करना चाहते हैं (विन्सेन्ज़ो पीआईआई द्वारा जवाब में) और पिछले टोकन को भी आउटपुट करना चाहते हैं, तो आप इस दृष्टिकोण का उपयोग करना चाह सकते हैं:

inline std::vector<std::string> splitString( const std::string &s, const std::string &delimiter ){
    std::vector<std::string> ret;
    size_t start = 0;
    size_t end = 0;
    size_t len = 0;
    std::string token;
    do{ end = s.find(delimiter,start); 
        len = end - start;
        token = s.substr(start, len);
        ret.emplace_back( token );
        start += len + delimiter.length();
        std::cout << token << std::endl;
    }while ( end != std::string::npos );
    return ret;
}

0
#include<iostream>
#include<algorithm>
using namespace std;

int split_count(string str,char delimit){
return count(str.begin(),str.end(),delimit);
}

void split(string str,char delimit,string res[]){
int a=0,i=0;
while(a<str.size()){
res[i]=str.substr(a,str.find(delimit));
a+=res[i].size()+1;
i++;
}
}

int main(){

string a="abc.xyz.mno.def";
int x=split_count(a,'.')+1;
string res[x];
split(a,'.',res);

for(int i=0;i<x;i++)
cout<<res[i]<<endl;
  return 0;
}

पुनश्च: विभाजन के बाद तार की लंबाई बराबर होने पर ही काम करता है


यह जीसीसी विस्तार - चर लंबाई सरणी का उपयोग करता है।
user202729

0

समारोह:

std::vector<std::string> WSJCppCore::split(const std::string& sWhat, const std::string& sDelim) {
    std::vector<std::string> vRet;
    int nPos = 0;
    int nLen = sWhat.length();
    int nDelimLen = sDelim.length();
    while (nPos < nLen) {
        std::size_t nFoundPos = sWhat.find(sDelim, nPos);
        if (nFoundPos != std::string::npos) {
            std::string sToken = sWhat.substr(nPos, nFoundPos - nPos);
            vRet.push_back(sToken);
            nPos = nFoundPos + nDelimLen;
            if (nFoundPos + nDelimLen == nLen) { // last delimiter
                vRet.push_back("");
            }
        } else {
            std::string sToken = sWhat.substr(nPos, nLen - nPos);
            vRet.push_back(sToken);
            break;
        }
    }
    return vRet;
}

यूनिट परीक्षण:

bool UnitTestSplit::run() {
bool bTestSuccess = true;

    struct LTest {
        LTest(
            const std::string &sStr,
            const std::string &sDelim,
            const std::vector<std::string> &vExpectedVector
        ) {
            this->sStr = sStr;
            this->sDelim = sDelim;
            this->vExpectedVector = vExpectedVector;
        };
        std::string sStr;
        std::string sDelim;
        std::vector<std::string> vExpectedVector;
    };
    std::vector<LTest> tests;
    tests.push_back(LTest("1 2 3 4 5", " ", {"1", "2", "3", "4", "5"}));
    tests.push_back(LTest("|1f|2п|3%^|44354|5kdasjfdre|2", "|", {"", "1f", "2п", "3%^", "44354", "5kdasjfdre", "2"}));
    tests.push_back(LTest("|1f|2п|3%^|44354|5kdasjfdre|", "|", {"", "1f", "2п", "3%^", "44354", "5kdasjfdre", ""}));
    tests.push_back(LTest("some1 => some2 => some3", "=>", {"some1 ", " some2 ", " some3"}));
    tests.push_back(LTest("some1 => some2 => some3 =>", "=>", {"some1 ", " some2 ", " some3 ", ""}));

    for (int i = 0; i < tests.size(); i++) {
        LTest test = tests[i];
        std::string sPrefix = "test" + std::to_string(i) + "(\"" + test.sStr + "\")";
        std::vector<std::string> vSplitted = WSJCppCore::split(test.sStr, test.sDelim);
        compareN(bTestSuccess, sPrefix + ": size", vSplitted.size(), test.vExpectedVector.size());
        int nMin = std::min(vSplitted.size(), test.vExpectedVector.size());
        for (int n = 0; n < nMin; n++) {
            compareS(bTestSuccess, sPrefix + ", element: " + std::to_string(n), vSplitted[n], test.vExpectedVector[n]);
        }
    }

    return bTestSuccess;
}

0
std::vector<std::string> parse(std::string str,std::string delim){
    std::vector<std::string> tokens;
    char *str_c = strdup(str.c_str()); 
    char* token = NULL;

    token = strtok(str_c, delim.c_str()); 
    while (token != NULL) { 
        tokens.push_back(std::string(token));  
        token = strtok(NULL, delim.c_str()); 
    }

    delete[] str_c;

    return tokens;
}

-4
std::vector<std::string> split(const std::string& s, char c) {
  std::vector<std::string> v;
  unsigned int ii = 0;
  unsigned int j = s.find(c);
  while (j < s.length()) {
    v.push_back(s.substr(i, j - i));
    i = ++j;
    j = s.find(c, j);
    if (j >= s.length()) {
      v.push_back(s.substr(i, s,length()));
      break;
    }
  }
  return v;
}

1
कृपया अधिक सटीक बनें। आपका कोड संकलित नहीं होगा। एक डॉट के बजाय "i" और अल्पविराम की घोषणा देखें।
जस्टुअर्डो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.