[英]how to parse command line arguments in C?
我正在尝试解析 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
必须以'-'
开头,如果我不希望命令元素以 '-' 开头,即使用./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
; 您可能会使用optind
周围的技巧跳过一些参数当然,您可以手动解析程序参数,因为它们是在 Linux 上通过main(int argc, char**argv)
(保证argc>0
,即argv[0]
是“程序名称”-例如当它不包含/
...时,在$PATH
找到它,该argv[argc]
是NULL
指针,在此之前,每个argv[i]
与i<argc
和i>0
都是以零结尾的字符串。见execve(2)了解更多。
GNU 编码标准:命令行界面非常清楚地记录了一些约定。 请至少遵守--help
和--version
约定!
您可能还担心自定义 shell 自动完成功能。 GNU bash 具有可编程完成。 zsh
有一个复杂的 补全系统。
请记住,在 Posix 和 Linux 上,命令字的通配是在启动程序之前由 shell 完成的。 见glob(7) 。
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
的命令行解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.