私はこれがかなり古いことを知っていますが、解決策を探しているときにこれに出くわしました。
while((command = getopt(argc, argv, "a:")) != -1){
switch(command){
case 'a':
(...)
optind--;
for( ;optind < argc && *argv[optind] != '-'; optind++){
DoSomething( argv[optind] );
}
break;
}
int optind ( getopt()で使用されるextern )は、 getopt()で選択された「現在のargv 」の後の次の位置を指していることがわかりました。だから最初は減らします。
まず、forループは、現在の引数の値がargvの境界内にあるかどうかをチェックします(argcは配列の長さであるため、配列argvの最後の位置はargc-1です)。&&の2番目の部分は、次の引数の最初の文字が「-」であるかどうかを比較します。最初の文字が「-」の場合、現在の引数の次の値が不足します。それ以外の場合、argv[optind]が次の値になります。そして、argvが終了するか、引数の値がなくなるまで続きます。
最後に、次のargvをチェックするためにoptindをインクリメントします。
' optind <argc 'をチェックしているため、最初の部分がtrueでない限り、条件の最初の2番目の部分は実行されないため、配列の境界の外側を読み取る心配はありません。
PS私はまったく新しいCプログラマーです。誰かが改善点や批評を持っている場合は、それを共有してください。