次の形式のコマンドライン引数が必要なプログラムがあります。
./my_program -m256M -tm -t some_other_file
「some_other_file」引数は -t にバインドされていないため (-t は単なる別の機能です)、フラグの optarg として使用することはできず、リストの最後の引数であると想定することもできません。
これどうやってするの?
ありがとう
次の形式のコマンドライン引数が必要なプログラムがあります。
./my_program -m256M -tm -t some_other_file
「some_other_file」引数は -t にバインドされていないため (-t は単なる別の機能です)、フラグの optarg として使用することはできず、リストの最後の引数であると想定することもできません。
これどうやってするの?
ありがとう
getopt(_long) は、引数がない場合 (-1 を返す場合)、解析済みのすべての引数が未解析の引数の前にあることを理解するように、argv の引数を並べ替えます。そのため、getopt が argv の最初の引数のインデックスに設定するグローバル変数 optind を使用できます。これは、プログラムへの追加の引数を見つけるために解析されませんでした。getopt によって認識される引数を除いて、そのような some_other_file が 1 つあると仮定すると、疑似コードは次のようになります。
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 を使用して、これらの解析されていない引数をリストできます。
それはあなたが望むものですか?
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