代码之家  ›  专栏  ›  技术社区  ›  Simone Margaritelli

如何获取前面没有“-”或“-”的参数

  •  1
  • Simone Margaritelli  · 技术社区  · 16 年前

    我有一个程序需要以下格式的命令行参数:

    ./my_program -m256M -tm -t some_other_file
    

    “some\u other\u file”参数没有绑定到-t(-t它只是另一个功能),因此我不能将它作为任何标志的optarg,也不能假定它是列表中的最后一个参数。

    我该怎么做?

    2 回复  |  直到 16 年前
        1
  •  4
  •   Michał Trybus    16 年前

    getopt(_long)以这样一种方式排列argv中的参数:当没有参数时(当它返回-1时),所有解析的参数都在未解析的参数之前。因此,您可以使用全局变量optind,getopt将其设置为argv中第一个参数的索引,它没有解析该参数以查找程序的任何其他参数。假设除了getopt已知的参数外,还有一个这样的文件,伪代码是:

    while ((ret = getopt_long(argc, argv, ...)) != -1) {
        /* do something with ret */
    }
    if (optind >= argc) {
        /* error, no some_other_file */
    } else {
        file_str = argv[optind];
        /* do something else */
    }
    

    此方法可以扩展到任意数量的无连字符参数,这些参数保证全部留在argv中,以便传递给程序,并且都在getopt理解的任何参数之后,因此可以使用optind到argc-1的简单循环来列出这些未解析的参数。

        2
  •  2
  •   N 1.1    16 年前

    这就是你想要的吗?

    int main(int argc, char* argv[]){
    //...
    int i=1;
    
    for(; i<argc; i++){
       if(argv[i][0] != '-'){
          printf("%s\n", argv[i]);
          //break; //if you dont want all arguments that don't start with - or --
       }
    }
    
    //...
    return 0;
    }
    

    $gcc dsad.c&&/a、 out-m256M-tm-t其他文件更多文件
    其他文件
    更多\u文件

    $gcc dsad.c&&/a、 out-m256M-tm-t一些其他文件-另一个
    其他文件

    推荐文章