2016-10-05 4 views
1

こんにちは非常に初心者の質問でのargcとargvのを作成するが、私はちょうどそれを把握することはできません。はコード

を私はバー

class foo 
{ 
    public: 
     bool bar(int argc, char** argv); 
} 

ARGVが

"--dir" and "/some_path/" 
を含むようになっているという名前の関数を持っています

argvとargcを作成してbar()に渡す方法はありますか?私は多くの方法を試したが、私はちょうどポインタと型変換権を得ることができません。

コマンドラインからargvを取得する代わりに、コード内に作成します。

ありがとうございました!

+0

作成した??いいえ! argvを使ってプログラムに引数を渡すことができます。 argcは渡されたパラメータの数です。argvは何か値、パスを保持することができます... – Raindrop7

+0

@ Raindrop7、時々あなたはプログラム内にargcとargvを作成する必要があります。たとえば、ブーストユニットテストを使用する場合は、最終的にメインを呼び出します。そしてアンドロイド(あなたがデバイス上でテストを実行したい場合)では、あなた自身でそれを呼び出さなければなりません。あなたはそれを引数にしなければなりません。 –

答えて

5

私のお気に入りの方法は、このようなものです:

std::vector<std::string> arguments = {"--dir", "/some_path"}; 

std::vector<char*> argv; 
for (const auto& arg : arguments) 
    argv.push_back((char*)arg.data()); 
argv.push_back(nullptr); 

f.bar(argv.size() - 1, argv.data()); 

引数が静的で変更されない場合、これは少し不合理なことです。しかし、このアプローチはRAIIに準拠しているという利点があります。それはあなたのためにメモリを管理し、適切な時点でオブジェクトを削除します。したがって、引数リストが動的な場合、それは最もクリーンな方法です。

さらに、f.barがargv配列のデータを変更する場合、このコードは技術的にUBです。通常これはそうではありません。

+1

'const char *'から 'char *'へ暗黙的に変換されます。 – Slava

+0

私は変換を明示的に行い、UBについての通知を追加しました。 –

+1

C++ 11の場合、キャストなしで左辺参照と '&arg [0]'を使用できます。とにかく、Cスタイルのキャストではなく、 'const_cast <>'が好きです。 – Slava

0

あなたはこのようにそれを呼び出すことができ、あなたがmainに渡されるのと同じ形式でのargcとargvをしたいと仮定:

foo f; 
char *args[] = { 
    (char*)"--dir", 
    (char*)"/some_path/", 
    NULL 
}; 
f.bar(2, args); 

(注:これはbarは、引数文字列を変更しません想定して - しますあなたがconst char **代わりのchar **に引数の型を変更する必要があります場合)

+2

'const char *'から 'char *'への変換は、C++では不正です – Slava

+0

segfault! argvの割り当てなし – Raindrop7

+0

@Slavaいいえ、そうではありません。変換は、キャストによって明示的に行われた場合、C++のすべてのバージョンで有効です。 C++ 11まで、変換は暗黙的に実行することもできますが、文字列リテラル(この答えにはあります)に対してのみ実行できます。ポイント先の文字列の変更は無効です。 – hvd

0

使用クラス文字列があまりにも強力です:

#include <iostream> 
#include <string> 

class foo 
{ 
    public: 
     void bar(int argc, std::string* argv); 
}; 

void foo::bar(int argc, std::string* argv) 
{ 
    //do somwthing 
    for(int i(0); i < argc; i++) 
     std::cout << "argv[" << i << "]: " << argv[i] << std::endl; 
} 


int main() 
{ 


    int argc; 
    std::cout << "Enter number of parameters: "; 
    std::cin >> argc; 
    std::cout << std::endl; 
    std::cin.ignore(1, '\n'); 

    std::string* sArgv = new std::string[argc]; 

    for(int i(0); i < argc; i++) 
    { 
     std::cout << "argv[" << i << "]: "; 
     std::getline(std::cin, sArgv[i]); 
     std::cout << std::endl; 
     std::cin.ignore(1, '\n'); 
    } 


    foo theFoo; 
    theFoo.bar(argc, sArgv); 

    delete[] sArgv; 
    sArgv = NULL; 

    std::cout << std::endl; 

    return 0; 
}