Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用一个可选参数将两个参数设置为main_C++_Command Line Arguments - Fatal编程技术网

C++ 使用一个可选参数将两个参数设置为main

C++ 使用一个可选参数将两个参数设置为main,c++,command-line-arguments,C++,Command Line Arguments,我想把命令行参数传递给main。它应该通过一个选项说明符来完成,比如-A4。对于单个字符和单个值,一切都可以正常工作,但当试图为每个选项传递两个值时,它只在最后一个值时工作 下面的代码在这样使用时可以正常工作/a.out-a4-b6-r21 a:4 b:6 x_0:2 y_0:1 但是,使用/a.out-r 2 3-a 32仅使用a和b的默认值 a:1 b:1 x_0:2 y_0:3 这与argv和argc的增量有关吗 谢谢你的帮助 代码:使用g++main.cc编译 //---------

我想把命令行参数传递给main。它应该通过一个选项说明符来完成,比如-A4。对于单个字符和单个值,一切都可以正常工作,但当试图为每个选项传递两个值时,它只在最后一个值时工作

下面的代码在这样使用时可以正常工作
/a.out-a4-b6-r21

a:4
b:6
x_0:2
y_0:1
但是,使用
/a.out-r 2 3-a 32
仅使用
a
b
的默认值

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;
}
//--------------------------------------
//包括
//--------------------------------------
#包括
#包括
//--------------------------------------
//函数声明
//--------------------------------------
void-getargosamin(int-argc,char*argv[]);
void showVars();
//--------------------------------------
//变量声明
//--------------------------------------
双a=1。;
双b=1。;
双x_0=a;
双y_0=0。;
//typedefs和名称空间
使用名称空间std;
//==函数======================
//姓名:main
//说明:
// =====================================
int main(int argc,char*argv[])
{
GetArgTomain(argc,argv);
showVars();
返回0;
}//------主功能结束----------
//--------------------------------------
//主要功能实现
//--------------------------------------
void getargn(int-argc,char*argv[])
{
而((argc>1)和&(argv[1][0]='-'))
{
开关(argv[1][1])
{
案例“a”:
a=atof(argv[2]);
打破
案例“b”:
b=atof(argv[2]);
打破
案例“r”:
x_0=atof(argv[2]);
如果(!argv[3])

cout对于每个选项的两个值,您需要一个额外的
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;
案例“r”:
x_0=atof(argv[2]);
如果(!argv[3]| | argv[3][0]=='-'){

cout您正在有效地单步执行接收到的参数数组。单步执行时,您需要“使用”尽可能多的参数。命令行上的每个单词都成为一个参数(除非使用引号将多个单词组合成一个参数)。当您将类似于
-rab
的内容作为一个单元进行处理时,您将使用三个参数


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

无需重新发明轮子:我可能错了,但从我所看到的来看,
Getopt
似乎不容易提供我想要的东西。我更愿意看到[(Boost)完全满足我的需要。非常感谢。你是对的!谢谢,如果给出了正确的参数数量,我会在每个选项之前检查。