2013-07-12 4 views
0

이 질문에 대한 몇 가지 예가 있습니다. 그러나 대부분의 대답은 제가 찾고있는 것이 아닙니다.C++에서 구분 기호로 문자열 분할

부스트 나 다른 STL 라이브러리가 아닌 효율적이고 쉬운 기능을 구현할 방법을 찾고 있습니다. 왜 대부분의 코딩 경쟁 및 인터뷰에서 그 이유를 묻는다면, 당신은 그것들을 사용할 수 없습니다.

vector<string> SplitString(const char *str, char c) 
{ 
    vector<string> result; 
    do { 
     const char *begin = str; 
     while(*str != c && *str) { 
      str++; 
     } 
     result.push_back(string(begin, str)); 
    } while (0 != *str++); 
    return result; 
} 

int main() { 

    string mainString = "This is a sentence. Another sentence. The third sentence. This is the last sentence."; 
    vector<string> sentences; 
    sentences = SplitString(mainString.c_str(), '.'); 
    while (!sentences.empty()) { 
     cout << sentences.back() << endl; 
     sentences.pop_back(); 
    } 
    return 0; 
} 

지금이의 문제, 그것은 단지 문자를 구분하지 문자열을 가질 수있다 : 여기

내가 접근 할 수있는 가장 가까운입니다. 몇 가지 방법을 구현할 생각은했지만 너무 복잡한 것처럼 보였습니다. 나는이 후 구분 기호 문자 배열의 첫 번째 문자로 배열 사용 c를 숯불에 구분 기호를 변환,라고 생각하는 가장 쉬운 하나

while(*str != c && *str) { 
    str++; 
} 
const char *beginDelim = *cArr; 
while(1) { 
    if (*str == *cArr && *str && *cArr) { 
     str++; 
     cArr++; 
    } 
    else if (!*cArr) { 
     break; 
    } 
    else if (*cArr) { 
     cArr = beginDelim; 
    } 
} 

그리고 코드는 result.push_back() 부분에서 계속됩니다.

그래서 문자열 구분 기호로 문자열을 분할하기위한 효율적이고 쉬운 기능을 구현하는 방법이 있는지 궁금합니다.

+0

그래서 당신은 구분 기호로 문자열을 원하는? – Aravind

+0

질문 하시겠습니까? –

+0

죄송합니다. 질문은 명확하지 않으며 마지막 문장을 편집했습니다. –

답변

0

일반적으로 문자열은 char 포인터입니다. 따라서 delimeter에서 첫 번째 문자를 검색 한 다음 바로 다음 문자를 확인해야합니다. 또한 귀하의 코드에서 나는 while (0! = * str ++)이 당신이 생각하는 것을하고 있는지 확신하지 못합니다. 나는 당신이 null로 끝나는 것을 의미한다고 생각합니다. 이 같은

0

뭔가를 수행해야합니다

vector<string> SplitString(const char* str,const char* d) { 
    vector<string> result; 
    size_t len = strlen(d); 
    const char* start = str; 
    while (str = strstr(start,d)) { 
    result.push_back(string(start,len)); 
    start = str + len; 
    } 
    result.push_back(start); 
    return result; 
} 
+0

경고 :이 줄에 진리 값 으로 사용 된 할당 주위에 괄호를 사용하십시오. "while (str = strstr (start, d)) {" –

0

방법이있다 :

#include <vector> 
#include <algorithm> 
#include <string> 

using namespace std; 

vector<string> SplitString(const string &str, const string &delim) 
{ 
    vector<string> ret; 
    string::const_iterator prev = str.begin(); 

    for (string::const_iterator i = str.begin(); i < str.end() - delim.length()+1; ++i) 
    { 
     if (equal(delim.begin(), delim.end(), i)) { 
      ret.push_back(string(prev,i)); 
      i += delim.length()-1; 
      prev = i+1; 
     } 
    } 

    ret.push_back(string(prev,str.end())); 

    return ret; 
} 
0
#include <iostream> 
#include <string> 
#include <vector> 

using namespace std; 

vector<string> SplitString(string str, const string &delim) { 
    vector<string> result; 
    size_t found; 
    while((found = str.find(delim)) != string::npos) { 
     result.push_back(str.substr(0, found)); 
     str = str.substr(found + delim.size()); 
    } 
    return result; 
} 

int main() { 
    string mainString = "This is a sentence. Another sentence. The third sentence. This is the last sentence."; 
    vector<string> sentences; 

    sentences = SplitString(mainString, "."); 

    for(auto& sentence : sentences) { 
     cout << sentence << endl; 
    } 
    return 0; 
} 
관련 문제