7

C++ プログラムからの引数を使用してコマンド ライン プログラムを実行するにはどうすればよいですか? これは私がオンラインで見つけたものです:

http://www.cplusplus.com/forum/general/15794/

std::stringstream stream;
stream <<"program.exe "<<cusip;
system(stream.str().c_str());

しかし、実際のプログラムの場所を受け入れないように見えるので、これを適用する方法がわかりません。私の希望は、次のようなものになることでした。

std::stringstream stream;
stream <<"C:\Tests\SO Question\bin\Release\HelloWorld.exe "<<"myargument";
system(stream.str().c_str());

これにより、バックスラッシュに関連するいくつかの警告が表示され、プログラムは機能しません。特定の場所にプログラムがあることを期待していますか?

これは、コンソールに表示される出力です。

「C:\Tests」は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されません。

補遺:

したがって、ジョンの答えに基づいて、私にとって正しいバージョンは次のようになります。

#include <iostream>
#include <cstdlib>
#include <sstream>
#include <cstring>
int main(int argc, char *argv[])
{

std::stringstream stream;    
stream << "\"C:\\Tests\\SO Question\\bin\\Release\\HelloWorld.exe\""
       << " " // don't forget a space between the path and the arguments
       << "myargument";
system(stream.str().c_str());

return 0;
}
4

2 に答える 2

10

まず第一に、実際の文字列値にバックスラッシュを 1 つだけ表示したい場合は、リテラル文字列にバックスラッシュを2 つ使用する必要があります。これは言語文法によるものです。準拠しているコンパイラは、これについて単に警告するよりも悪いことをする可能性があります。

いずれにせよ、発生している問題は、Windows ではスペースを含むパスを二重引用符で囲む必要があるためです。二重引用符自体は C++ 文字列リテラル内でエスケープする必要があるため、記述する必要があるのは

stream << "\"C:\\Tests\\SO Question\\bin\\Release\\HelloWorld.exe\""
       << " " // don't forget a space between the path and the arguments
       << "myargument";
于 2013-02-11T22:15:41.163 に答える
5

これにより、バックスラッシュに関連するいくつかの警告が表示されます

\代わりに使用するC ++のエスケープ文字は、\\おそらくこの問題を解決すると思います。

于 2013-02-11T22:12:43.280 に答える