Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中解析命令行参数?_C_Parsing_Getopt - Fatal编程技术网

如何在C中解析命令行参数?

如何在C中解析命令行参数?,c,parsing,getopt,C,Parsing,Getopt,我正在尝试用C语言解析命令行参数。目前,我正在使用getopt进行解析。我有这样的想法: #include <unistd.h> int main(int argc, char ** argv) { while((c=getopt(argc, argv, "abf:")) != -1) { switch(c) { case 'a': break; case 'b': break;

我正在尝试用C语言解析命令行参数。目前,我正在使用
getopt
进行解析。我有这样的想法:

#include <unistd.h>

int main(int argc, char ** argv)
{
   while((c=getopt(argc, argv, "abf:")) != -1)
   {
     switch(c)
     {
        case 'a':
        break;
        case 'b':
        break;
        case 'f':
        puts(optarg);
        break;
        case ':':
        puts("oops");
        break;
        case '?'
        puts("wrong command");
        break;
     }
   }
}
#包括
int main(int argc,字符**argv)
{
而((c=getopt(argc,argv,abf:)!=-1)
{
开关(c)
{
案例“a”:
打破
案例“b”:
打破
案例“f”:
看跌期权(optarg);
打破
案例“:”:
看跌期权(“oops”);
打破
案例“?”
puts(“错误命令”);
打破
}
}
}
然后需要使用
/a.out-f
来运行程序,并且
-f
是命令元素,但是看起来
-f
必须以
'-'开头,如果我不希望命令元素以'-'开头,即使用
/a.out-f
而不是
/a.out-f
,如何实现它


如果
getopt
不支持以这种方式解析命令行,那么在C中是否还有其他库可使用?

使用
argc
argv
变量可以访问您要查找的内容
argc
是“参数计数”,而
argv
是“参数向量”(字符串数组)

getopt
是一个非常有用且功能强大的工具,但是如果您不能以破折号开头,您可以直接访问参数数组:

int main( int argc, char** argv) {
    if( argc != 1) { /* problem! */ }
    char * argument = argv[1]; // a.out f ... argv[1] will be "f"
}
您可以(在带有GNU libc的Linux上)用于:

  • 使用
    getopt_long
    ;您可以使用
  • 这是相当强大的
当然,您可以手动解析程序参数,因为它们是通过Linux上的
main(int-argc,char**argv)
给出的(保证
argc>0
,即
argv[0]
是“程序名”-例如,当它不包含
//code>时,在
$PATH
中找到它,
argv[argc]
NULL
指针,在此之前的每一个
argv[i]
都带有
i以获取更多信息

清楚地记录一些约定。请至少遵守
--help
--version
约定

您可能还需要定制shell自动完成功能。gnubash有。
zsh
有一个复杂的功能


请记住,在Posix和Linux上,命令字的全局搜索是在启动程序之前由shell完成的。请参阅。

在第一个非选项参数处,
getopt
库将停止解析。对于基于命令的程序,这将位于命令名处。然后,您可以将
optind
设置为索引,以从开始并运行e> 再次使用命令特定的参数获取opt

例如:

// general getopts
if (optind >= argc) return 0; // error -- no command
if (strcmp(argv[optind], "command") == 0)
{
    ++optind; // move over the command name
    // 'command'-specific getopts
    if (optind >= argc) return 0; // error -- no input
}

这应该允许类似于命令行解析的
git

为什么不希望标志以
-
开头?这是UNIX惯例。同意。使命令行选项“特殊”没有帮助任何人。无关:如果声明了
c
,可能会有很大帮助。如果你真的想成为一个特别的小雪花,谷歌是你的朋友。@mafso所以
git
选项不能用标准的
getopt
/
getopt\u long
API解析——他们使用自己的自定义解析器来处理。这一切都是免费的取决于您希望命令行界面的复杂程度(例如,如果您希望命令前的选项与命令后的选项得到不同的处理)。据我所知,
argv[0]
是可执行文件的名称,
argv[1]
是传递给程序的第一个参数。除了
argv[0]
通常与程序名有关。您应该检查
argv[1]
argc>1
时,有没有任何方法可以使用getopt而不以“-”开头?这并不容易。getopt使用
-
来开始参数行。我想您可以重写argv,在通过getopt发送参数之前在参数上包含
-
,但这比手动解析参数更难获得正确的结果阿格斯。