0

execvp を使用する Linux で C++ 関数を作成しています。この関数に渡される唯一のパラメーターは、exec の引数を示す char* です。この char* を execvp の char** に変換する必要があり、引用符を考慮する必要があります。以下に例を示します。

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

これを行うための組み込みの方法はありますか?そうでない場合、自分のパーサーを書く以外にできる簡単なことはありますか?

4

1 に答える 1

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;
}
于 2013-08-11T20:33:10.690 に答える