C 中带有 char*const* 指针的函数 getopt

Function getopt in C with char*const* pointer

我想使第三个参数成为可能,如下所示: (任意位置的文件名)

program -a 3 <filename> -b 6
program -a 3 -b 6 <filename>

如何使用 getopt 执行此操作并将此字符串保存在变量 file 中?

int main(int argc, char *const *argv) {

   int a = 0;   int b = 0; int i = 0;  
   char *A;     char *B;
   char *file = NULL;

   int c;opterr = 0; 
  
   while ((c = getopt (argc, argv, "a:b:")) != -1)  {
     switch (c) {

       case 'a': a = 1; A = optarg; break;
       case 'b': b = 1; B = optarg; break;

       case '?': 
         if (optopt == 'c')             fprintf (stderr, "Option -%c requires an argument.", optopt);
         else if (isprint (optopt))     fprintf (stderr, "Unknown option `-%c'.", optopt);
         else                           fprintf (stderr,"Unknown option character `\x%x'.",optopt);

       default: file = optarg; break; }}

   
   strcpy(&file,*(argv + i));

  return 0;
}

getopt 函数要求所有参数都在所有非参数之前。因此 getopt 无法处理 program -a 3 <filename> -b 6。文件名必须在末尾,或者必须有与之关联的选项字母。

关于读取文件名,您可以在 getopt 循环之后进行。 optind 变量包含下一个尚未处理的参数的索引,因此可以从 argc 中减去此值并将其添加到 argv 以处理从 0.[=17 开始的剩余参数=]

argc -= optind;
argv += optind;
file = argv[0];