如何在C中解析命令行参数?
我正在尝试用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;
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发送参数之前在参数上包含-
,但这比手动解析参数更难获得正确的结果阿格斯。