1

コマンドライン引数をmainに渡したい。-a 4のようなオプション指定子を使用して実行する必要があります。単一の文字と単一の値の場合、すべてが正常に機能しますが、オプションごとに2つの値を渡そうとすると、最後に入力した場合にのみ機能します。

次のコードは、このように使用すると希望どおりに機能します./a.out -a 4 -b 6 -r 2 1

a:4
b:6
x_0:2
y_0:1

ただし、と./a.out -r 2 3 -a 32のデフォルト値のみを使用して使用されます。ab

a:1
b:1
x_0:2
y_0:3

それはargvとargcの増分と関係がありますか?

ご協力いただきありがとうございます。

コード:gでコンパイル++ main.cc

//--------------------------------------
//  Includes
//--------------------------------------
#include <iostream>
#include <cstdlib>

//--------------------------------------
//  Function Declarations
//--------------------------------------
void getArgsToMain(int argc, char *argv[]);
void showVars();

//--------------------------------------
//  Variable declarations
//--------------------------------------
double a    = 1.;
double b    = 1.;
double x_0  = a;
double y_0  = 0.;

// typedefs and namespace
using namespace std;    

// ===  FUNCTION  ======================
//         Name:  main
//  Description:  
// =====================================
int main ( int  argc , char * argv[] )
{
    getArgsToMain(argc, argv);
    showVars();
    return 0;
}// ----------  end of function main  ----------


//--------------------------------------
//  Main function implementations
//--------------------------------------
void getArgsToMain(int argc, char *argv[])
{
    while ((argc>1) && (argv[1][0]=='-'))
    {
        switch(argv[1][1])
        {
            case 'a':
                 a=atof(argv[2]);
                 break;
            case 'b':
                 b=atof(argv[2]);
                 break;
            case 'r':
                 x_0=atof(argv[2]);
                 if (!argv[3])
                        cout<<"Warning: No y_0 specified. Reverting to default."<<endl;
                 else
                    y_0=atof(argv[3]);
                 break;
            default: 
                 cout<<"Usage: blabla";
                 exit(0);
        }
        argv++;
        argv++;
        argc--;
        argc--;
    }
}

void showVars()
{
    cout << endl;
    cout << "a:" << a << endl;
    cout << "b:" << b << endl;
    cout << "x_0:" << x_0 << endl;
    cout << "y_0:" << y_0 << endl;
}
4

2 に答える 2

1

argv++, argc--オプションケースごとに2つの値を追加する必要があります。2番目の値がすでに次のオプションであるかどうかもテストします。

case 'r':
     x_0=atof(argv[2]);
     if (!argv[3] || argv[3][0] == '-') {
            cout<<"Warning: No y_0 specified. Reverting to default."<<endl;
     } else {
        y_0=atof(argv[3]);
        argv++;
        argc--;
     }
     break;

@ezodが提案したように、を使用することができますgetopt。getoptに関する同様の要件については、 getopt およびCgetoptの複数の値を使用してコマンドラインオプションに2つの引数を指定するを参照してください。

于 2012-11-18T20:25:47.937 に答える
1

受け取った引数の配列を効果的にステップスルーしています。ステップするときは、使用した数の引数を「消費」する必要があります。コマンドラインの各単語は1つの引数になります(引用符を使用して複数の単語を1つの引数に結合しない限り)。1つのユニットのように処理する場合-r a b、3つの引数を消費します。

あなたのコードは、あなたが常に一対の引数を消費していることを前提としています。引数を1つだけ渡すと、フラグの引数の処理に失敗する可能性があることに注意してください。-r欠落している引数を防ぐチェックはありません。少なくとも2つの引数が残っていることを確認しますが、-rフラグには合計3つの引数が必要です。 。

于 2012-11-18T20:29:17.890 に答える