2013-08-11 2 views
0

Я пишу функцию C++ в Linux, которая использует execvp. Единственным параметром, переданным этой функции, является символ char *, который указывает аргументы для exec. Мне нужно преобразовать этот символ * в голец ** для execvp и мне нужно принять во внимание цитату, вот пример:Разбор командной строки в массив argv

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

Есть некоторые встроенный способ сделать это? если нет, есть ли что-то более простое, чем я могу написать собственный парсер?

+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 **, этот метод все еще работает, используя функцию «transform». http://stackoverflow.com/questions/7048888/stdvectorstdstring-to-char-array – Dave

Смежные вопросы