C getopt和getopt_long只适用于主参数吗?

时间:2016-04-20 21:01:30

标签: c getopt getopt-long

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

  

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

我正在尝试将它与另一个与主要具有相同签名的函数一起使用,argcargvwordexp一起获得,所以每个事情看起来都是一样的,但是当调用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)。 / p>

谢谢。

1 个答案:

答案 0 :(得分:3)

getopt()getopt_long()都适用于char **intargv与其他char **之间没有区别。 如果您将argvargc或其副本从main传递到您的函数并从那里调用getopt(),它将会起作用。显示您的函数如何获得argcargv;