コマンドラインを実行可能ファイルと引数の 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 );
}
}
}