2014-10-12 4 views
0

안녕 난 다음C++을 사용하여 구분 기호로 문자열을 분할하는 방법은 무엇입니까?

data1 
sample data 

에 문자열 라이브러리를 사용하여 위의 문자열을 분할 할 문자열

{ 
"data1" : "sample data", 
"data2" : "sample data2" 
} 

다음 한 것은 내가 생각 해낸 코드입니다하지만 그것은 단지 왼쪽 분할과 오른쪽 아니다. 위의 데이터는 버퍼에 저장되고 line_number에 의해 반복됩니다.

if(pos != std::string::npos) 
      { 
       newpos = buffer[line_number].find_first_of(":",pos); 
       token = buffer[line_number].substr(pos + 1,newpos-pos-1); 
       pos = newpos + 1; 
       std::cout << token << std::endl; 
      } 

도움말 정말 감사하겠습니다.

+3

당신이 난 그냥 특별히 키와 값을 구분합니다 Lol4t0 @ JSON 파서 – Lol4t0

+0

를 사용해야 JSON을 구문 분석하려면 – codeg33k

답변

0

아주 간단한 파서는 다음과 같습니다

#include <iostream> 
#include <string> 
#include <vector> 
#include <map> 

using namespace std; 

static string& strip(string& s, const string& chars = " ") 
{ 
     s.erase(0, s.find_first_not_of(chars.c_str())); 
     s.erase(s.find_last_not_of(chars.c_str()) + 1); 
     return s; 
} 

static void split(const string& s, vector<string>& tokens, const string& delimiters = " ") 
{ 
     string::size_type lastPos = s.find_first_not_of(delimiters, 0); 
     string::size_type pos = s.find_first_of(delimiters, lastPos); 
     while (string::npos != pos || string::npos != lastPos) { 
       tokens.push_back(s.substr(lastPos, pos - lastPos)); 
       lastPos = s.find_first_not_of(delimiters, pos); 
       pos = s.find_first_of(delimiters, lastPos); 
     } 
} 

static void parse(string& s, map<string,string>& items) 
{ 
     vector<string> elements; 
     s.erase(0, s.find_first_not_of(" {")); 
     s.erase(s.find_last_not_of("} ") + 1); 
     split(s, elements, ","); 
     for (vector<string>::iterator iter=elements.begin(); iter != elements.end(); iter++) { 
       vector<string> kv; 
       split(*iter, kv, ":"); 
       if (kv.size() != 2) continue; 
       items[strip(kv[0], " \"")] = strip(kv[1], " \""); 
     } 
} 

int 
main() 
{ 
     string data = " { \"key1\" : \"data1\" , \"key2\" : \"data2\" } "; 
     map<string,string> items; 
     parse(data, items); 

     for (map<string,string>::iterator iter=items.begin(); iter != items.end(); iter++) { 
       cout << "key=" << (*iter).first << ",value=" << (*iter).second << endl; 
     } 
} 
관련 문제