【问题标题】:getopt to take only one argumentgetopt 只接受一个参数
【发布时间】:2018-03-26 23:46:32
【问题描述】:

我有一个关于 C 语言中的 getopt 的问题。我有多个选项标志,并试图让它为所有事情采用一个参数。命令行类似于command -a fileNamecommand -b fileNamecommand -ab fileName。基本上每个命令都接受一个文件名,如果他们想组合命令,他们应该只需要输入一个文件名。在 getopt 中,字符串看起来像 a:b:,变量设置为 argv[argc -1]。如果它只是一个选项,这很好,但如果有多个选项(即command -ab fileName)则失败,因为: 强制用户输入一个选项,但:: 将使单个选项不强制用户输入一个选项。有什么建议吗?

【问题讨论】:

  • 根据getopt 文档:“如果 getopt() 检测到缺少参数并且 optstring 的第一个字符是冒号 ( ':' ),则应返回冒号 ( ':' )。 "所以,也许将:a:b: 传递给getopt。
  • 也许你应该有一个特定的标志来附加文件名,而不是重载其他参数。例如,getopt(argc, argv, "f:abcde")
  • 文件名真的是选项的参数,而不仅仅是命令的参数吗?你能写command filename没有选项吗?

标签: c getopt


【解决方案1】:

optind 全局变量让您知道使用了多少个argv 字符串。所以解决这个问题的一种方法是去掉冒号,并使用像“ab”这样的字符串。 下面是代码的示例(改编自手册页中的示例):

int main(int argc, char *argv[])
{
    int ch;
    while ((ch = getopt(argc, argv, "ab")) != -1)
    {
        if (ch == 'a')
            printf("Got A\n");
        else if (ch == 'b')
            printf("Got B\n");
        else
            printf("Got confused\n");
    }

    if (optind != argc-1) 
        printf("You forgot to enter the filename\n");
    else
        printf("File: %s\n", argv[optind]);
}

如果你用类似的命令行运行它

./test -ab hello

输出是

Got A
Got B
File: hello

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2021-05-05
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多