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

时间:2014-09-09 19:23:29

标签: 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;
        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中是否还有其他库?

3 个答案:

答案 0 :(得分:1)

argcargv变量可让您访问所需内容。 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

当然你可以手动解析程序参数,因为它们在Linux上通过main(int argc, char**argv)给出(保证argc>0argv[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 completionzsh有一个复杂的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 - 就像命令行解析一样。