【问题标题】:Do C getopt and getopt_long only work for main arguments?C getopt 和 getopt_long 仅适用于主要参数吗?
【发布时间】:2016-04-20 21:01:30
【问题描述】:

这个问题很清楚,我想知道因为那个人说

getopt() 函数解析命令行参数。

我正在尝试将它与另一个与 main 具有相同签名的函数一起使用,并且 argcargv 是通过 wordexp 获得的,所以一切看起来都一样,但是当调用 getopt 我得到一个分段调用 getopt_long 后立即出错。

#define   OPT_HELP    'h'
#define   OPTL_HELP   "help"
#define   OPT_MESS    'm'
#define   OPTL_MESS   "message"

#define   OPT_STRING  "hm:"

struct option longopts[] = {
  {OPTL_HELP,     no_argument, 0, OPT_HELP},
  {OPTL_MESS,     required_argument, 0, OPT_MESS},
  {0, 0, 0, 0}
};

#define FLAG_MESS 1

void cmd_chat(int argc, char **argv)
{
  int c, indexptr;
  short flag = 0;
  char message[481];
  while ((c = getopt_long(argc, argv, OPT_STRING,
          longopts, &indexptr)) != -1) {
    debug(MAGENTA "cmd_chat", MAGENTA "c value: %d", c);
    switch (c) {
      case OPT_HELP:
        debug(MAGENTA "cmd_chat", MAGENTA "calling help");
        help(argv[0]);
        return;
        break;
      case OPT_MESS:
        flag |= FLAG_MESS;
        strncpy(message, optarg, 481);
        break;
      default:
        usage(argv[0]);
        break;
    }
  }


[...]

可能是这样,但如果是这样,我想知道为什么会这样,为什么我们应该将 argcargv 传递给 getopt(_long)。

谢谢。

【问题讨论】:

  • 一个不常说明的假设是,您调用getopt() 等时始终使用argcargv 的相同值,而不是在每次调用时更改列表。如果您使用getopt() 处理命令行参数,然后使用它访问其他一些参数集,您可能(不一定会)遇到问题。你在做这样的事吗? (基本上,没有对并发性的规定——它不是线程安全的——也没有对重用的规定。通常有一种半未公开的方式来重置系统,以便重新开始,但它会有所不同。)
  • 没有对getopt的调用来自同一个线程,因此是按顺序完成的。

标签: c getopt getopt-long


【解决方案1】:

getopt()getopt_long() 都适用于每个正确的 char **intargv 和任何其他 char ** 之间没有区别。 如果您将argvargc 或它们的副本从main 传递到您的函数并从那里调用getopt(),它将起作用。展示你的函数是如何得到argcargv的;

【讨论】:

  • 好吧,酷。我真的不知道分段错误来自哪里......我在调用命令(它是一个 shell 程序)chat -h 之前打印了 argv 值,argv 被很好地解析并且 argc 设置为 2 .我尝试了一个简单的getopt调用,没有任何while循环,然后立即打印返回值,但我仍然遇到分段错误。我可以看到它来自对 getopt_long 的调用,因为打印尚未完成。
  • 那么你在你的程序中调用了两次 getopt 吗?如果调用两次,则需要在第二次调用之前将optind 设置为0。并提供mcve:stackoverflow.com/help/mcve
  • 我已经对 while 循环进行了注释,并将其替换为对 getopt_long 的一次调用,我得到了分段错误,因此没有两次调用,但我尝试在第一次调用之前将 optind 设置为 0作品。我没有在男人身上看到它。
猜你喜欢
  • 2015-05-02
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-11
  • 2012-01-26
  • 1970-01-01
相关资源
最近更新 更多