1

我有一个这样的程序:

./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 中的引号的情况下获取所有团队名称的任何帮助?

4

3 回答 3

4

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

  1. 使用多个“-n”参数:

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

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

于 2013-07-02T14:29:14.057 回答
2

您也可以使用optind. optint跟踪遇到的选项数量。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;

我希望这有帮助。

于 2013-07-02T15:14:29.697 回答
0

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

于 2013-07-02T14:38:56.023 回答