2011-05-17 14 views

答えて

8

ない正確にはできますが、簡単に近づくことができます。

#include <iostream> 
#include <vector> 
#include <string> 

using namespace std; 

typedef vector<string> CommandLineStringArgs; 

int main(int argc, char *argv[]) 
{ 
    CommandLineStringArgs cmdlineStringArgs(&argv[0], &argv[0 + argc]); 

    for (int i = 0; i < cmdlineStringArgs.size(); ++i) 
    { 
     cout << cmdlineStringArgs[i] << endl; 
    } 

    return 0; 
} 

これは単にベクターにコマンドライン引数をコピーし、イテレータのペアを終了/初めを取るのstd ::ベクトルのオーバーロードされたコンストラクタを使用しています。そこからのjavaとほとんど同じです。

同様に、引数を変換するユーティリティメソッドを使用して、そのベクトルの周りに構築したり、オブジェクトを処理したりすることはできますが、ほとんど意味がありません。また、コマンドラインスイッチの解釈などを扱う多くのオブジェクトが含まれています。 ACE、POCO、QTなどはすべてこのような施設が付いています。

+0

最初にすべての引数を 'std :: vector'にコピーする目的は何ですか?同じループが 'argv'を直接反復することもできます。 – sbi

+0

@sbi - 要点はOPの質問に答えたことです。彼が達成したいことは、より良いOPに向けられています。 – Duck

+1

それはナンセンスです。 'argv'へのインデックス付けは、seanの質問にも同様に答えました。その引数をベクトルにする方法を尋ねるところはありませんでした。あなたは彼に不必要に丸い道を見せただけです。 – sbi

3

はい主な機能はargcは、引数の数であるとargvは、引数のリストが含まれている2つの引数

int main(int argc, char* argv[]) 

を取ることができます。例えば

は、あなたのようにあなたのプログラムを実行する場合:Cで

MyProgram.exe hello 

その後

argc = 2 
argv[0] = MyProgram.exe 
argv[1] = "hello" 
0

、メイン関数のシグネチャは次のようになります。

int main(int argc, char** argv)

argcには、コマンドラインで渡される引数の数が含まれています。実行ファイルの名前は0の位置にあり、argcに1が追加されます。

argvには、引数を含む文字列の配列が含まれています。ここでも位置0は実行可能ファイルの名前です。

0

標準C++ main()署名がargcは、コマンドライン引数の数を表し、argv[]は、コマンドライン引数を保持するプリミティブC文字列の配列である

int main(int argc, char* argv[]) 

あります。 は、コマンドラインから起動される実行可能ファイルです。

1

言語に組み込まれていないが、実装がその非常に簡単:

#include <vector> 
#include <string> 
using namespace std; 

int main(int argc, char *argv[]) { 
    vector <string> args; 
    for (int i = 0; i < argc; i++) { 
     args.push_back(argv[i]); 
    } 
    // do something with args 
} 
+1

このループは必要ありません。 'std :: vector'にはそのための素晴らしいコードがあります。 – sbi

+0

@sbi私は知っているが、OPはおそらく私のコードをより簡単に理解するだろう。 –

+0

あなたは単純に使うことができます: 'std :: vector args(argv、agrv + argc);'。 – Nawaz

10

ベクトルを使用して、文字配列を文字列に取得できます。

#include <vector> 
#include <string> 
using namespace std; 

int main (int argc, char** argv) 
{ 
    vector <string> args (argv, argv + argc); 
} 
+0

'namespace std'を使用しない場合、私はこれをupvoteします。 (http://stackoverflow.com/questions/2879555/c-stl-how-to-write-wrappers-for-cout-cerr-cin-and-endl/2880136#2880136) – sbi

+1

@sbiそれは必ずしも悪いことではありません.cppファイルの中で行うこと。これがヘッダーか、例1関数ファイルより複雑なものであれば、私はあなたに同意する傾向があります。彼はBoostや他の巨大な図書館を使っているわけではないので、名前の衝突は問題ではないはずです。 – xDD

+0

これは実際にはC++プログラムに引数を渡す標準的な方法ではありません。 – Pepe

0

あなたはWin32アプリケーションを作成している場合、あなたはGetCommandLineW http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspxとCommandLineToArgW http://msdn.microsoft.com/en-us/library/bb776391(VS.85).aspx

を使用することができ、あなたの実行ファイルがパスにスペースがあり、場合に必要とされる特別な取扱いについてCommandLineToArgページにコメントがありますあなたが扱わなければならないかもしれない議論はありません。

関連する問題