【问题标题】:Get two parameters to main with one optional argument使用一个可选参数获取两个参数给 main
【发布时间】:2012-11-18 20:13:40
【问题描述】:

我想将命令行参数传递给 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;
}

【问题讨论】:

标签: c++ command-line-arguments


【解决方案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。见Supplying two arguments to command line option using getoptC getopt multiple value 了解有关 getopt 的类似要求。

【讨论】:

  • 正是我需要的。非常感谢。
【解决方案2】:

您实际上是在逐步浏览收到的参数数组。步进时,您需要“使用”尽可能多的参数。命令行上的每个单词都成为一个参数(除非您使用引号将多个单词组合成一个参数)。当您将-r a b 之类的内容作为一个单元处理时,您会消耗三个参数。

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

【讨论】:

  • 你是对的!谢谢,如果给出了正确数量的参数,我会在每个选项之前检查。
猜你喜欢
  • 1970-01-01
  • 2023-04-08
  • 2022-07-26
  • 2019-01-28
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多