0

以下是我使用选项的代码getopt()。现在,我想为我使用的单个选项提供多个参数atoi(atgv[i]),其中 i= 2,3,4,..... 我的代码显然适用于以下命令行:./a.out -m 7 3 -f 1 4 5 -M 3 6 5 1 但显然不适用于./a.out -f 1 4 5or./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(). 我的代码是:

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


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

int opt;
int a,b,c,d,e,f,g,h,i,j,k,x;

while ((opt = getopt(argc, argv, "mfM:")) != -1) {

switch (opt) {


case 'm': 
a= atoi(argv[2]);
b= atoi(argv[3]);
c=a+b;
printf("The sum is: %d\n",c);
break;

case 'f':
d= atoi(argv[5]);
e= atoi(argv[6]);
x=atoi(argv[7]);
f=d+e+x;
printf("The sum is: %d\n",f);
break;


case 'M': 
g= atoi(argv[9]);
h= atoi(argv[10]);
i=atoi(argv[11]);
j=atoi(argv[12]);
k=g+h+i+j+k;
printf("The add is: %d\n",k);
break;


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

   }        

  }
} 
4

2 回答 2

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$
于 2013-08-15T11:09:42.500 回答
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;
}
于 2020-06-05T03:06:30.327 回答