繁体   English   中英

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

[英]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 中使用?

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"
}

您可以使用(在带有 GNU libc 的 Linux 上) 解析程序参数

当然,您可以手动解析程序参数,因为它们是在 Linux 上通过main(int argc, char**argv) (保证argc>0 ,即argv[0]是“程序名称”-例如当它不包含/ ...时,在$PATH找到它,该argv[argc]NULL指针,在此之前,每个argv[i]i<argci>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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM