19

我的论点是这样的

./a.out -i file1 file2 file3

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

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

我得到了file1; 如何获得file2file3

4

5 回答 5

31

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

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()使用的外部)指向getopt ()选择的“当前argv ”之后的下一个位置;这就是为什么我一开始就减少它的原因。

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

最后递增选择检查下一个 argv。

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

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

于 2011-11-02T14:55:38.110 回答
10

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

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

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

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

/a.out file1 file2 file3
于 2010-10-15T03:11:07.317 回答
6

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

于 2010-10-15T04:09:16.053 回答
6

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

我想要的处理是:

-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;

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

于 2012-08-11T15:32:13.317 回答
0

GoTtimw 的解决方案对我来说非常有用。但是,我想再提一个想法,这里还没有建议。

以这种方式将参数作为一个字符串传递。

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

然后你得到一个字符串作为一个参数,你只需要用空格分割它。

于 2019-12-26T17:27:22.857 回答