C++ 使用一个可选参数将两个参数设置为main
我想把命令行参数传递给main。它应该通过一个选项说明符来完成,比如-A4。对于单个字符和单个值,一切都可以正常工作,但当试图为每个选项传递两个值时,它只在最后一个值时工作 下面的代码在这样使用时可以正常工作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编译 //---------
/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)完全满足我的需要。非常感谢。你是对的!谢谢,如果给出了正确的参数数量,我会在每个选项之前检查。