1

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

./my_program -m256M -tm -t some_other_file

“some_other_file”参数未绑定到 -t(-t 它只是另一个功能),所以我不能将它作为任何标志的 optarg,我也不能假设它是列表中的最后一个参数。

我怎样才能做到这一点?

谢谢

4

2 回答 2

4

getopt(_long) 以这样的方式排列 argv 中的参数,即当没有参数时它可以理解左侧(当它返回 -1 时)所有已解析的参数都在未解析的参数之前。所以你可以使用全局变量 optind,它 getopt 设置为 argv 中第一个参数的索引,它没有解析它以便为你的程序找到任何额外的参数。假设除了 getopt 已知的参数之外,还有一个这样的 some_other_file,伪代码将是:

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 的简单循环to argc-1 可用于列出这些未解析的参数。

于 2010-04-15T22:20:55.433 回答
2

那是你要的吗?

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 some_other_file more_file
some_other_file
more_file
$ gcc dsad.c && ./a.out -m256M -tm -t
$ gcc dsad.c && ./a.out - m256M -tm -t some_other_file --another
some_other_file

于 2010-04-15T20:32:01.210 回答