2

コマンドラインを実行可能ファイルと引数の 2 つの文字列に分割する C++03 の最良の方法は何ですか?

例えば:

  • "\"c:\\Program Files\\MyFile.exe\" /a /b /c" => "c:\Program Files\MyFile.exe", "/a /b /c"

  • "c:\\Foo\\bar.exe -t \"myfile.txt\"" => "c:\Foo\bar.exe", "-t \"myfile.txt\""

  • "baz.exe \"quantum conundrum\"" => "baz.exe", "\"quantum conundrum\""

適切なソリューションは、引用符とスペースの両方を処理する必要があります。

ブーストは許容されます。

私の現在の(作業中の)ソリューション:

void split_cmd( const std::string& cmd, 
                std::string* executable, 
                std::string* parameters )
{
    std::string c( cmd );
    size_t exec_end;
    boost::trim_all( c );
    if( c[ 0 ] == '\"' )
    {
        exec_end = c.find_first_of( '\"', 1 );
        if( std::string::npos != exec_end )
        {
            *executable = c.substr( 1, exec_end - 1 );
            *parameters = c.substr( exec_end + 1 );
        }
        else
        {
            *executable = c.substr( 1, exec_end );
            std::string().swap( *parameters );
        }
    }
    else
    {
        exec_end = c.find_first_of( ' ', 0 );
        if( std::string::npos != exec_end )
        {
            *executable = c.substr( 0, exec_end );
            *parameters = c.substr( exec_end + 1 );
        }
        else
        {
            *executable = c.substr( 0, exec_end );
            std::string().swap( *parameters );
        }
    }
}
4

0 に答える 0