获取相同选项的多个值

时间:2013-07-02 14:20:23

标签: c getopt

我有一个这样的程序:

./server

具有以下用途:

Usage : 
-p  Port to use (4242 by default)
-x  Map width (20)
-y  Map height (20)
-n  Team name (name_team1 name_team2)
-c  Players per team
-t  Delay 

我能够使用以下代码解析所有选项:

int parse_cmd(int argc, char **argv, t_args *a)
{
    char ch;

    if (argv[1] && argv[1][0] != '-')
        usage();
    while ((ch = getopt(argc, argv, "p:x:y:n:c:t:")) != -1)
    {
        if (ch == 'p')
            a->port = atoi(optarg);
        else if (ch == 'x')
            a->x = atoi(optarg);
        else if (ch == 'y')
            a->y = atoi(optarg);
        else if (ch == 'n')
            a->teams = name_teams(optarg);
        else if (ch == 'c')
            a->size = atoi(optarg);
        else if (ch == 't')
            a->delay = atoi(optarg);
        else
            usage();
    }
    if (check_values(a) == FALSE)
        return (FALSE);
    return (TRUE);
}

但问题是,对于-n选项,我必须得到这样的球队名称:

./server -n team1 team2 team2

我无法改变它的方式。

显然我可以这样做:

./server -n "team1 team2 team3"

并解析团队,但这是我的公司,他们不想在团队名称周围加上引号,不要问我为什么......

如何在不使用shell中的引号的情况下获取所有团队名称的任何帮助?

3 个答案:

答案 0 :(得分:4)

我认为你有三个不同的可能性:

  1. 使用多个'-n'参数:

    ./server -n team1 -n team2 -n team3
    
  2. 使用像','这样的字符作为optarg中的分隔符

    ./server -n team1,team2,team3
    
  3. 不要使用getopt,而是为自己的

  4. 解析argv

答案 1 :(得分:2)

您也可以使用optindoptint会跟踪遇到的选项数量。 optind指向argv[]

遇到的getopt()中的下一个索引

因此,您可以在argv中查找是否有团队。但为了实现这一点,你应该在optstring中省略“:”,就像在下一个片段"p:x:y:nc:t:"中一样,或者在循环中使用它之前减少optint的值。

这只是一个确定循环是否必须继续的简单函数。

int 
is_team ( const char* team ) {
    if ( team == NULL)
        return 0;
    else if ( team[0] == '-' ) /*new argument*/
        return 0;
    else
        return 1;
}

这就是当你遇到'n'选项时你也可以使用optstring中的冒号,但是也会计算遇到选项,然后i = optind - 1也可以工作

case 'n':
    { /*note this scope is significant*/
        int i;
        for ( i = optind ; is_team(argv[i]); ++i  ) {
            printf ( "team = %s\n", argv[i]);
            //argument = ++*optarg;
        }
    }
    break;

我希望这会有所帮助。

答案 2 :(得分:0)

getopt分支中使用else if (ch == 'n')来解析所有团队,直到下一个选项发生。