c - C getopt 和 getopt_long 是否仅适用于主要参数?

标签 c getopt getopt-long

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

The getopt() function parses the command-line arguments.

我正在尝试将它与另一个与 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()getopt_long() 都适用于每个适当的 char **intargv 和任何其他 char ** 之间没有区别。 如果您将 argvargc 或它们的副本从 main 传递到您的函数并从那里调用 getopt(),它将起作用。展示你的函数如何得到 argcargv;

关于c - C getopt 和 getopt_long 是否仅适用于主要参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36755103/

相关文章:

c - 两个进程读取相同的标准输入

c - 以非选项字符开头时 getopt_long() 失败

c - 如何返回每个函数实例大小不同的 VLA?

c - 如何检查点 (x,y) 是否在笛卡尔坐标系中的多边形内?

将二进制序列化转换为人类可读的序列化

c - Optarg 字符串比较 C

C 强制 getopt 在第一个非参数处停止

c - 从 unix 命令行运行时 getopt 无法正常工作

c - 为什么gdb一直显示optarg为0x0

c++ - gengetopt : How to parse a string without an option (like a file name)