通过getopt传递一些参数

时间:2014-07-04 13:23:55

标签: c command-line getopt

我想要做的是从命令行获取更多参数,并让它们在新行上输出每个参数。我怎么能通过保持相同的结构来做到这一点?我也希望获得-f输出。

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <getopt.h>

int
main(int argc, char *argv[])
{
    int nod1, opt;
    int nsecs, nod2;

   nsecs = 0;
    nod2 = 0;
    nod1 = 0;

    while ((opt = getopt(argc, argv, "nf:")) != -1) {
        switch (opt) {
        case 'n':
            nod1 = 1;
            break;
        case 'f':
            nsecs = atoi(optarg);
            nod2 = 1;
            break;
        default: /* '?' */
            fprintf(stderr, "Usage: %s [-t nsecs] [-n] name\n",
                    argv[0]);
            exit(EXIT_FAILURE);
        }
    }

   printf("nod1=%d; nod2=%d; optind=%d\n", nod1, nod2, optind);

   if (optind >= argc) {
        fprintf(stderr, "Expected argument after options\n");
        exit(EXIT_FAILURE);
    }

   printf("Output = %s\n", argv[optind]);

   /* Other code omitted */

   exit(EXIT_SUCCESS);
}

来自评论:

  

-f之后的参数应该是可选的,我想列出彼此传递的每一个参数......

$ ./partitioner -n 4 -f Test1 Test2 Test3 Test4
Number:4
File names:
Output = Test1
Output = Test2
Output = Test3
Output = Test4
$

1 个答案:

答案 0 :(得分:0)

考虑到Jonathan Leffler的评论,我编辑了我的答案:

  

POSIX getopt()并没有明智地处理可选参数。 GNU getopt()有点好,但不是很多。尽可能避免使用它们。

我提出了一个简单的想法,但可以解决你的问题,所以这里是:

argv中,您有一个参数列表,因为它们在推荐行中是正确的吗?因此,如果您在-f中找到任何argv,则表示-f之后的所有参数,直到另一个选项或参数列表的结尾是您要打印的选项。

-f到另一个选项(在这种情况下为-g):

  

./ command -a A -b B -f 一棵二树 -g G

-f到最后。

  

./ command -a A -b B -f 一棵二树

这里有一个帮助函数:

bool get_f_args(int argc, char *argv[], int &count, int* indexes)
{
    bool f_found = false, parsing_f_args = false;
    int collect_count = 0;

    if (argc < 3) return false;  // "./command -f" are just two values for argv
                                 // we need at least 3.

    // Check for every argument in the argument list.
    for (int i = 1; i < argc; i++)
    {

        // If you found another option
        // stop collecting args.
        if (argv[i][0] == '-' && parsing_f_args)   // options starts with '-' character.
            parsing_f_args = false;

        if (parsing_f_args)
            indexes[count++] = i;

        // If some is "-f" then the following are the 
        // ones you're looking for. We check for -f after
        //
        // indexes[count++] = i; 
        //
        // in roder to avoid adding -f index to indexes.
        if (strcmp("-f", argv[i]) == 0) { 
            parsing_f_args = true;
            f_found = true;
        }

    }
    return f_found;
}

这是一个使用示例:

int main(int argc, char* argv[])
{
    int count = 0; 
    int indexes[10];

    bool f_found = get_f_args(argc, argv, count, indexes);
    if (f_found){
        for (int i = 0; i < count; i++)
            printf("Ouput = %s\n", argv[indexes[i]]);
    }

    return 0;
}