我正在尝试解析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;
}
}
}
然后需要使用./a.out -f
来运行程序,-f
是命令元素,但看起来-f
必须以'-'
开头,如果我不这样做希望命令元素以&#39; - &#39;开头,即使用./a.out f
代替./a.out -f
,如何实现呢?
如果getopt
不支持以这种方式解析命令行,那么在C中是否还有其他库?
答案 0 :(得分:1)
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"
}
答案 1 :(得分:0)
您可以使用(在Linux上使用GNU libc)parsing program arguments:
getopt_long
;您可以使用tricks around optind
当然你可以手动解析程序参数,因为它们在Linux上通过main(int argc, char**argv)
给出(保证argc>0
,argv[0]
是“程序名称”-eg要在$PATH
不包含/
...时找到它,argv[argc]
是NULL
指针,那之前argv[i]
i<argc
{1}}和i>0
是一个以零结尾的字符串。有关详情,请参阅execve(2)。
GNU coding standards: command line interfaces非常明确地记录了一些惯例。请至少遵守--help
和--version
惯例!
您可能还担心自定义shell自动完成功能。 GNU bash有programmable completion。 zsh
有一个复杂的completion system。
请记住,在Posix和Linux上,命令字的全局变量是在启动程序之前由shell 完成的。请参阅glob(7)。
答案 2 :(得分:0)
getopt
库将在第一个非选项参数处停止解析。对于基于命令的程序,这将是命令名称。然后,您可以将optind
设置为索引以启动,并使用特定于命令的参数再次运行getopt
。
例如:
// 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
- 就像命令行解析一样。