2013-08-11 2 views
0

execvp를 사용하는 Linux에서 C++ 함수를 작성하고 있습니다. 이 함수에 전달되는 유일한 매개 변수는 exec에 대한 인수를 나타내는 char *입니다. 이 작업을 수행하는 몇 가지 기본 방법은argv 배열에 명령 행 구문 분석

/path/to/program "argument one" argument two 
    - results in - 
/path/to/program 
argument one 
argument 
two 

있습니까 : 나는 execvp는 대한 ** 숯불이의 char *로 변환해야 내가 계정 인용 고려 할 필요가 여기에 예입니다? 그렇지 않다면, 내 자신의 파서를 작성하는 것보다 더 간단하게 할 수있는 무언가가 있습니까?

+0

쉘의 구문 분석 능력을 활용하고 전체 문자열을 'bash'또는 유사하게 실행할 수 있습니까? 아니면 프로그램을 직접 실행해야합니까? –

+0

프로그램을 직접 실행하는 것을 선호합니다 (C++ 만 사용) – Dave

답변

1
#include <string> 
#include <vector> 

std::vector<std::string> stringToArgv(std::string const& in) 
{ 
    std::vector<std::string> out; 

    std::string arg; 

    char quoteChar = 0; 

    for (std::string::const_iterator I = in.begin(), E = in.end(); I != E; ++I) 
    { 
     char ch = *I; 

     // Quoting a single character using the backslash? 
     if (quoteChar == '\\') 
     { 
      arg.push_back(ch); 
      quoteChar = 0; 
      continue; 
     } 

     // Currently quoting using ' or " ? 
     if (quoteChar && ch != quoteChar) 
     { 
      arg.push_back(ch); 
      continue; 
     } 

     switch (ch) 
     { 
     case '\'': // Toggle quoting 
     case '\"': // Toggle weak quoting 
     case '\\': // Toggle single character quoting... 
      quoteChar = quoteChar ? 0 : ch; 
      break; 

     case ' ': 
     case '\t': 
     case '\n': 
      // Arguments are separated by whitespace 
      if (!arg.empty()) 
      { 
       out.push_back(arg); 
       arg.clear(); 
      } 
      break; 

     default: 
      arg.push_back(ch); 
      break; 
     } 
    } 

    // Append the last argument - if any 
    if (!arg.empty()) 
    { 
     out.push_back(arg); 
    } 

    return out; 
} 
+0

감사합니다. 주로 Windows dev을하는 중 '\\'구분 기호를 잊어 버렸습니다. 필자는 char **를 얻으려고해도이 메서드는 여전히 "변환"함수를 사용하여 작동한다는 것을 언급해야합니다. http://stackoverflow.com/questions/7048888/stdvectorstdstring-to-char-array – Dave