以下是我使用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()
答案 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;
}