c++ - C++中可变数量的命令行参数

标签 c++ arguments

我有一个程序 (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/

相关文章:

c++ - 在行星模拟器中使用 boost::thread

c++ - 线程安全的 vector 和字符串容器?

javascript - 如何最好地确定参数是否未发送到 JavaScript 函数

c++ - 我可以在实际函数调用中将静态映射定义为函数参数吗?

python - 第一个未命名参数可选

c++ - 一个函数可以有一个像 (x | y) 这样的参数吗?它是如何工作的?

c++ - 是否可以使 lambda 签名中的模板变量通用?

c++ - 将方法的签名作为模板参数传递给类

整数除法余数的 C++ 确定性

r - 函数参数匹配 : by name vs by position