我正在用c编写一个程序,它接受命令行参数,比如--version,-download。
当我这样做时:

$program --version --download file

程序输出版本并下载文件。但当我这么做的时候:
$program --download --version file

程序认为--version--download的参数。
我使用了getopt_long()函数来解析命令行参数。以下是我的代码片段:
while ((ch = getopt_long(argc, argv, "d:g:hv", longoptions, &optindex)) != -1 )
{
    switch(ch)
    {
            case 'd' :
                if ( optarg )
                    printf("Downloading %s...\n" , optarg);
                iso(optarg);
                break ;

            case 'g' :
                if ( optarg )
                    printf("Downloading glug-mirror automation script for %s ...\n", optarg);
                getscript(optarg);
                break ;

            case 'v' :
                printf("glug version 1.0.0 ( NIT Hamirpur)\n");
                break ;

            case 'h' :
                usage(status);
                break ;

            default :
                status  = 2 ;
               usage(status);
    }
}

最佳答案

getoptlong()正在做它应该做的事情。
格式字符串"d:g:hv"意味着参数dg需要一个值。
在命令行参数之后指定的任何内容都将考虑传递给它的值。
你应该以

$program --download file --version

检查这个detailed example演示了使用getoptlong()的各个方面。
如何处理其命令行参数的不同位置?
显然是因为rm的参数(rmr等)不接受任何值作为参数。因此v不会传递给它们中的任何一个,而是单独的一个命令行参数。您可以从source-code of rm中确认这一点。
要对程序执行类似的操作,需要将optstring修改为directory并分别处理参数"dghv"

10-07 20:03
查看更多