C getopt多值

w00*_*00d 19 c input getopt

我的论点是这样的

./a.out -i file1 file2 file3
Run Code Online (Sandbox Code Playgroud)

如何利用getopt()3个(或更多)输入文件?我正在做这样的事情:

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

我得到了file1; 怎么弄file2,file3

GoT*_*imw 29

我知道这已经很老了,但我在寻找解决方案时遇到了这个问题.

while((command = getopt(argc, argv, "a:")) != -1){

    switch(command){
        case 'a':

        (...)

        optind--;
        for( ;optind < argc && *argv[optind] != '-'; optind++){
              DoSomething( argv[optind] );         
        }

        break;
    }
Run Code Online (Sandbox Code Playgroud)

我发现int optind(getopt()使用的extern )指向getopt()选择的'当前argv ' 之后的下一个位置; 这就是为什么我在开始时减少它.

首先进行循环检查,如果当前参数的值在argv的边界内(argc是数组的长度,那么数组argv中的最后位置是argc-1).&&的第二部分比较下一个参数的第一个字符是' - '.如果第一个char是' - ',那么我们用完当前参数的下一个值,否则argv [optind]是我们的下一个值.依此类推,直到argv结束或参数耗尽值.

最后增加optind以检查下一个argv.

请注意,因为我们正在检查' optind <argc ',除非第一部分为真,否则不会执行第二部分条件,因此不必担心在数组边界外读取.

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

  • 这是相当古老的,但我想我可能会添加一个批评.你不仅要检查' - ',还要确保`strlen(argv [optind])`等于2.这样可以确保它能正确处理以破折号开头的参数.这段代码对我有帮助!+1 (3认同)

jam*_*lin 10

如果必须,你可以从自己开始argv[optind]增加optind.但是,我建议不要这样做,因为我认为语法不好.(当你到达列表的末尾时,你怎么知道?如果某人有一个名为a的文件-作为第一个字符怎么办?)

我认为最好将语法更改为:

/a.out -i file1 -i file2 -i file3
Run Code Online (Sandbox Code Playgroud)

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

/a.out file1 file2 file3
Run Code Online (Sandbox Code Playgroud)


R..*_*R.. 6

请注意,glibc的不一致参数置换扩展将破坏以-i这种方式使用多个参数的任何尝试.在非GNU系统上,"第二个参数-i"将被解释为第一个非选项参数,暂停任何进一步的选项解析.考虑到这些问题,getopt如果您想使用这种语法,我会删除并编写您自己的命令行解析器,因为它不是支持的语法getopt.


And*_*ard 5

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

我想要的处理方法是:

-m mux_i2c_group mux_i2c_out
Run Code Online (Sandbox Code Playgroud)

(需要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;
Run Code Online (Sandbox Code Playgroud)

这像往常一样从我那里获取了第一个值,然后只是寻找了第二个REQUIRED值。