C getopt多值

我的论点是这样的

./a.out -i file1 file2 file3 

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

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

我只得到file1 ; 如何获取file2file3

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

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

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

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

 /a.out file1 file2 file3 

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

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

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

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

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

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

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

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

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

我想要的处理是:

 -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, "\nm option require TWO arguments  " "\n\n"); usage(); } use_mux_flag = 1; break; 

这抓住了我正常的第一个值,然后只是寻找第二个,REQUIRED值。