这个问题非常清楚,我想知道因为那个男人说
getopt()函数解析命令行参数。
我正在尝试将它与另一个与主要具有相同签名的函数一起使用,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
)。 / p>
谢谢。
答案 0 :(得分:3)
getopt()
和getopt_long()
都适用于char **
和int
,argv
与其他char **
之间没有区别。
如果您将argv
和argc
或其副本从main传递到您的函数并从那里调用getopt()
,它将会起作用。显示您的函数如何获得argc
和argv
;