C getopt 和 getopt_long 是否仅适用于主要参数?
Do C getopt and getopt_long only work for main arguments?
问题很清楚,我想知道因为那个人说
The getopt() function parses the command-line arguments.
我正在尝试将它与另一个具有与 main 相同签名的函数一起使用,并且 argc
和 argv
是通过 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;
}
}
[...]
可能是这样,但如果是这样,我想知道为什么会这样,为什么我们应该将 argc
和 argv
传递给 getopt
(_long
) .
谢谢。
getopt()
和 getopt_long()
都适用于每个适当的 char **
和 int
,argv
和任何其他 [=12] 没有区别=].
如果您将 argv
和 argc
或它们的副本从 main 传递到您的函数并从那里调用 getopt()
,它将起作用。显示您的函数如何获得 argc
和 argv
;
问题很清楚,我想知道因为那个人说
The getopt() function parses the command-line arguments.
我正在尝试将它与另一个具有与 main 相同签名的函数一起使用,并且 argc
和 argv
是通过 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;
}
}
[...]
可能是这样,但如果是这样,我想知道为什么会这样,为什么我们应该将 argc
和 argv
传递给 getopt
(_long
) .
谢谢。
getopt()
和 getopt_long()
都适用于每个适当的 char **
和 int
,argv
和任何其他 [=12] 没有区别=].
如果您将 argv
和 argc
或它们的副本从 main 传递到您的函数并从那里调用 getopt()
,它将起作用。显示您的函数如何获得 argc
和 argv
;