1

我想将命令行参数传递给 main。它应该通过像 -a 4 这样的选项说明符来完成。对于单个字符和单个值,一切正常,但是当尝试为每个选项传递两个值时,它只有在最后放入时才有效。

以下代码在这样使用时按需要工作./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--的两个值。还要测试第二个值是否已经是下一个选项。

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 和C getopt multiple value为命令行选项提供两个参数。

于 2012-11-18T20:25:47.937 回答
1

您正在有效地逐步浏览收到的参数数组。步进时,您需要“使用”尽可能多的参数。命令行上的每个单词都成为一个参数(除非您使用引号将多个单词组合成一个参数)。当您将某些东西-r a b作为一个单元进行处理时,您会消耗三个参数。

您的代码假定您总是使用一对参数。请注意,如果您只传递一个参数,您可能无法处理-r标志的参数:没有检查防止丢失参数:您检查您是否至少有两个参数剩余,但-r标志总共需要三个参数.

于 2012-11-18T20:29:17.890 回答