使用getopt()在单个选项中的多个参数

时间:2013-08-15 10:54:36

标签: c

以下是我使用getopt()使用选项的代码。现在,我想为单个选项提供多个参数,我使用atoi(atgv[i]),其中i = 2,3,4,.....我的代码显然可以使用以下命令行:{{1但显然不适用于./a.out -m 7 3 -f 1 4 5 -M 3 6 5 1 ./a.out -f 1 4 5./a.out -M 3 6 5 1./a.out -f 1 4 5 -M 3 6 5 1。我尝试使用./a.out -m 7 3 -M 3 6 5 1,但它只接受给定选项的单个参数。那么,我如何为单个选项提供多个参数呢?我没有必要使用optarg()。我的代码是:

getopt()

2 个答案:

答案 0 :(得分:0)

类似的结构:

case 'm': 
a= atoi(argv[2]);
b= atoi(argv[3]);

违背了getopt()的全部目的。

如果你有一个带getopt()的命令指定参数“mfM:”,那就意味着你可以指定某人

program -m -f -M 3

program -f -M 3 -m

等等。

其次,如果你想要一个选项的多个参数并且想要使用getopt,你应该真正指定:

program -M 3 -M 4 -M 5

等等。

以下是我重写程序的方法。

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

int main(int argc, char** argv)
{

  int opt;
  int mv = 0, fv = 0, Mv = 0;

  while ((opt = getopt(argc, argv, "m:f:M:")) != -1) {

    switch (opt) {

    case 'm': 
      mv = mv + atoi(optarg);
      break;

    case 'f':
      fv = fv + atoi(optarg);
      break;


    case 'M': 
      Mv = Mv + atoi(optarg);
      break;

    default: //default case
      fprintf(stderr, "Usage: %s [-f or -m or -M] filename\n", argv[0]);
      exit(EXIT_FAILURE);

    }        
  }

  printf ( "-m sum %d\n", mv );
  printf ( "-f sum %d\n", fv );
  printf ( "-M sum %d\n", Mv );
  return 0;
} 

以这种方式运行。

amrith@amrith-vbox:~/so$ ./go -m 3 -m6 -m 14 -f 2 -M 1 -M6 -M12 -M 18
-m sum 23
-f sum 2
-M sum 37
amrith@amrith-vbox:~/so$

答案 1 :(得分:0)

好吧,这是我设法解决这个问题的方法;作为arg_v上的“ optagr”点,我们可以按其长度前进以访问下一个:

pointer arithmetic :: av[i + 1] = av[i] + len(av[i]) + 1

我们继续操作,直到偶然发现缓冲区的第一个字符为'-'为止。

然后我们保护它,以防万一没有跟随它,通过检查它是否也等于env的第一个元素(就像papy所说的那样,跟随它在内存中的argv),这是“ char * limit”部分


int manage_op(char op, char *opt_arg, server_t *server, char *limit)
{
    int i = 0;

    switch (op) {
        case 'n':
                for (char *buff_name = opt_arg;*buff_name != '-' && (strcmp(limit, buff_name));
                buff_name = buff_name + strlen(buff_name) + 1)
                    server->teams_name[i++] = strdup(buff_name);
                server->teams_name[i] = NULL;
        case 'x':
            server->x = atoi(opt_arg);
            break;
        case 'y':
            server->y = atoi(opt_arg);
            break;
        case 'f':
            server->freq = atoi(opt_arg);
            break;
        case 'p':
            server->port = strdup(opt_arg);
            break;
        case 'c':
            server->nbr_max_per_teams = atoi(opt_arg);
            break;
    }
    if (server->port == -1)
        exit(84);
}

int main(int ac, char **av, char **env)
{
    char *buf = NULL;
    server_t *server_v = malloc(sizeof(server_t));
    int op;

    if ((ac > 1) && (!strcmp(av[1], "-h")  || !strcmp(av[1], "-help"))) {
        printf("%s", HELP);
        return 0;
    }
    server_v->teams_name = malloc(sizeof(char *)* ac);
    while (op = getopt(ac, av, "p:x:y:c:f:n:")) {
        if (op == -1)
            break;
        manage_op(op, optarg, server_v, env[0]);
    }
    for (int i = 0;server_v->teams_name[i]; i++)
        printf("%s\n",server_v->teams_name[i]);
    //server("8000");
    return 0;
}