2009-10-12 8 views
0

문자열의 구문 분석 문제를 해결하기 위해 노력하고 있습니다 ** 어떤 이유로 아래 코드는 휴지통, 누구든지 제발 좀 봐 주실 래요? C++ char ** -> vector <string> -> string -> char ** 구문 분석 문제

  • 덤프 모두가 string_array에 argv를 용기를
  • 을 성병 : : 문자열로 string_array 컨테이너의 모든 덤프와 브레이크
  • 공간
  • 와 별도 : 여기
    1. 어떻게 해야하는거야 문자열을 문자열로 바꿈 부스트/알고리즘/문자열을 사용하는 토큰
    2. 새 문자 **를 생성하고 토큰을 모두 덤프하고 새 문자 **, clea n 위로

    내가 잘못 했나요?

    #include <string> 
    #include <vector> 
    #include <iostream> 
    
    #include <boost/algorithm/string.hpp> 
    
    using namespace std; 
    using namespace boost; 
    
    typedef vector<string> string_array; 
    
    int main(int argc, char ** argv) 
    { 
        string_array args; 
        string_array tokens; 
        cout << "Real arguments :" << endl; 
        for(int i = 0; i < argc; i++) 
        { cout << argv[i] << endl;} 
    
        string arg = ""; 
        for(int i = 1; i < argc; i++) 
        { 
         args.push_back(argv[i]); 
        } 
        for(int i = 0; i < (int)args.size(); i++) 
        { 
         arg += args[i]; 
         if(i != (int)args.size() - 1) 
          arg += " "; 
        } 
    
        split(tokens, arg, is_any_of(" ")); 
    
        char ** new_args = NULL; 
        new_args = new char*[(int)tokens.size()]; 
        for(int i = 0; i < (int)tokens.size(); i++) 
        { 
         new_args[i] = new char[(int)tokens[i].size()]; 
         for(int j = 0; j < (int)tokens[i].size(); j++) 
         { 
          new_args[i][j] = tokens[i][j]; 
         } 
        } 
    
        for(int i = 0; i < (int)tokens.size(); i++) 
        { std::cout << new_args[i] << std::endl; } 
        delete [] new_args; 
    } 
    
    +0

    어디에서 어떻게 잘못됩니까? – Mark

    +2

    또한 new_args의 메모리 릴리스가 올바르지 않습니다. 루프에서 new_args [i]도 삭제해야합니다. –

    +0

    @aJ : 대체로 올바르지 만 new_args [i]를 삭제하기 위해 배열 형태의 삭제를 사용해야합니다. :-) –

    답변

    4

    C 스타일 문자열 (char*)은 제로 종료를 의미합니다. 따라서 new char[tokens[i].size()] 대신에 할당에 1을 더해야합니다 : new char[token[i].size() + 1]. 또한 문자열을 0으로 종료하려면 new_args[i][tokens[i].size()] = 0으로 설정해야합니다.

    std::string과 달리 char*은 문자열 길이를 보유하지 않으므로 영숫자가 없으면 프로그램에서 인쇄를 중지 할 수 없습니다.

    +1

    기술적으로, 누군가가 '\ 0'이 아니라 '0'으로 문자열을 끝내기 시작하도록 "null-terminated"해야합니다. –

    +0

    글쎄, 0은'(0)'이 아니라'(char) 0'을 의미합니다. 하지만 네가하는 말을 듣는다. 사람들이 NUL (포인터)과 NUL (문자)을 섞어서 NUL을 의미 할 때 0 대신 NULL을 쓰는 것을 시작하기 때문에 "null-terminated"를 사용하는 것을 좋아하지 않습니다. 이는 내 생각에 심각하게 쿨하지 않습니다. 제안을 환영합니다. –

    +0

    그게 다행 이네! – Maciek

    관련 문제