Как получить аргумент, которому не предшествует '-' или '-' - PullRequest
1 голос
/ 15 апреля 2010

У меня есть программа, которой нужны аргументы командной строки в форме:

./my_program -m256M -tm -t some_other_file

Аргумент "some_other_file" не связан с -t (-t это просто другая функциональность), поэтому я не могу принять его как оптарг любого из флагов, а также не могу предположить, что это последний аргумент в списке .

Как я могу это сделать?

Спасибо

Ответы [ 2 ]

4 голосов
/ 16 апреля 2010

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 до argc-1 может использоваться для перечисления этих непарсированных аргументов.

2 голосов
/ 16 апреля 2010

Это то, что вы хотите?

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

...