我有一个程序 (myprogram
),它接受一个文件作为输入并创建另一个文件作为输出。语法是:
我的程序输入文件输出文件
看起来像这样:
int main ( int argc, char *argv[] )
{
...
if ( argc != 3 ) {
cout<<"wrong number of arguments"<< endl; return 1;}
}
myInputFile = argv[1];
myOutputFile = argv[2];
...
}
所以这里我将 argv[1]
作为输入文件。我现在想为语法添加一些选项。因此,例如,我想将 myprogram -a inputfile outputfile
作为一个选项。选项的数量会有所不同。
这意味着文件名将取决于参数的数量。
在代码中执行此操作的最聪明方法是什么?我可以看到有人会只将最后两个参数作为文件名,然后假设之前的参数是选项(所以类似于 myInputFile = argv[argc - 1]
。这不是感觉很对,因为我最终得到了很多 if ... then
语句。
所以我的问题是:如何最好地处理可变数量的参数?
最佳答案
如果您不想使用库怎么办:
char* myInputFile = NULL ;
char* myOutputFile = NULL ;
bool option_a = false ;
int argi = 1 ;
while ( argi < argc )
{
const char* args = argv[ argi++ ] ;
switch ( *args )
{
case '-' : /* option/switch */
if ( strcmp( args, "-a" ) == 0 )
option_a = true ;
else
{
std::cerr << "Unknow option " << args << "\n" ;
exit( 1 ) ;
}
break ;
default :
if ( myInputFile == NULL )
myInputFile = args ;
else if ( myOutputFile == NULL )
myOutputFile = args ;
else
{
std::cerr << "Unexpected argument " << args << "\n" ;
exit( 1 );
}
break ;
}
}
最后,当您处理所有参数时,您可以进行一些最终检查,例如,测试是否设置了输入文件和输出文件:
if ( myInputFile == NULL )
{
std::cerr << "Input file missing!\n" ;
exit( 1 ) ;
}
...
您还可以将所有参数放入一个结构中,而不是将它们分开:
struct options_t
{
char* myInputFile ;
char* myOutputFile ;
bool option_a ;
options_t() : myInputFile(), myOutputFile(), option_a() {}
} ;
这样您就可以将所有参数传递给您的函数,而不是一一列出。
只是一个想法...
关于c++ - C++中可变数量的命令行参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23090974/