代码之家  ›  专栏  ›  技术社区  ›  w00d

C getopt多值

  •  18
  • w00d  · 技术社区  · 16 年前

    ./a.out -i file1 file2 file3
    

    getopt() 要获取3个(或更多)输入文件? 我在做这样的事:

    while ((opt = getopt(argc, argv, "i:xyz.."))!= -1){
      case 'i':
         input = optarg; 
         break;
      ...
    }
    

    file1 ;如何获得 file2 , file3 ?

    4 回复  |  直到 12 年前
        1
  •  10
  •   jamesdlin    16 年前

    如果你必须的话,你可以从 argv[optind] optind 你自己。但是,我建议不要这样做,因为我认为语法形式不好。(你怎么知道自己什么时候到了名单的末尾?如果某人有一个名为 -

    我认为最好还是把语法改成:

    /a.out -i file1 -i file2 -i file3
    

    或将文件列表视为位置参数:

    /a.out file1 file2 file3
    
        2
  •  30
  •   GoTTimw    14 年前

    while((command = getopt(argc, argv, "a:")) != -1){
    
        switch(command){
            case 'a':
    
            (...)
    
            optind--;
            for( ;optind < argc && *argv[optind] != '-'; optind++){
                  DoSomething( argv[optind] );         
            }
    
            break;
        }
    

    我发现了 内部选项 (外用 getopt() )指向“当前”之后的下一个位置 阿格夫 '选择者 getopt() 所以我一开始就减少了。

    首先 检查当前参数的值是否在 阿格夫 ( argc公司 是数组的长度,因此数组argv中的最后一个位置是 ). && 比较下一个参数的第一个字符是否为“-”。如果第一个字符是“-”,那么当前参数的下一个值就用完了,否则argv[optind]就是下一个值。等等,直到argv结束或参数值用完为止。

    末端增量 检查下一个argv。

    注意,因为我们正在检查 选项<argc '除非第一部分为真,否则不会执行条件的第一部分和第二部分,因此不必担心读取数组边界以外的内容。

    PS我是一个相当新的C程序员如果有人有改进或批评请分享。

        3
  •  6
  •   R.. GitHub STOP HELPING ICE    16 年前

    -i 以这种方式。在非GNU系统上,“第二个论点 将被解释为第一个非选项参数,停止任何进一步的选项解析。考虑到这些问题,我会放弃 getopt 如果要使用此语法,请编写自己的命令行解析器,因为它不受 getopt公司

        4
  •  5
  •   Jonathan Leffler    12 年前

    我查看并尝试了上面的代码,但我发现我的解决方案更容易一些,对我来说效果更好:

    我想要的是:

    -m mux_i2c_group mux_i2c_out
    

    (需要2个参数)。

    以下是我的经历:

    case 'm':
        mux_i2c_group = strtol(optarg, &ch_p, 0);
    
        if (optind < argc && *argv[optind] != '-'){
            mux_i2c_out = strtol(argv[optind], NULL, 0);
            optind++;
        } else {
            fprintf(stderr, "\n-m option require TWO arguments <mux_group> "
                            "<mux_out>\n\n");
            usage();
        }
    
        use_mux_flag = 1;
        break;
    

        5
  •  0
  •   Dmytro Oliinychenko    6 年前

    戈蒂姆的解决方案证明对我非常有用。不过,我想再提一个想法,这里还没有提出。

    ./a.out -i "file1 file2 file3"
    

    然后得到一个字符串作为单个参数,只需要按空格分隔它。

    推荐文章