我知道这个问题被多次询问,但我仍然无法弄明白
#include<stdio.h>
#include<getopt.h>
int ch;
int queue_time=60;
int thread_num=4;
char *scheduling_algo="FCFS";
extern char *optarg;
int port=8080;
int debug_flag,h_flag,l_flag;
int main(int argc,char *argv[])
{
while ((ch = getopt(argc, argv, "dhlprtns")) != -1)
switch(ch)
{
case 'd':
debug_flag=atoi(optarg); /* print address in output */
break;
case 'h':
h_flag=atoi(optarg);
break;
case 'l':
l_flag=atoi(optarg);;
break;
case 'p':
port = atoi(optarg);
break;
case 'r':
printf("%s",optarg);
break;
case 't':
queue_time = atoi(optarg);
break;
case 'n':
thread_num = atoi(optarg);
break;
case 's':
scheduling_algo = optarg;
break;
default:
printf("nothing was passed");
}
printf("%d",queue_time);
printf("%d",debug_flag);
printf("%d",h_flag);
printf("%d",l_flag);
}
我正在使用以下命令执行我的程序
./a.out -d -h -l -t 55
我收到核心转储错误。我在谷歌上看了几个例子,但我仍然面临着这个问题。有人可以帮忙吗?
答案 0 :(得分:8)
您需要阅读getopt()
的手册页 while ((ch = getopt(argc, argv, "dhlprtns")) != -1)
^^^^^^^^
这与您使用参数的方式不符。您 希望冒号“:”在期望参数的标志之后。在你的代码中 “d”后面没有冒号,但你似乎想要一个值:
case 'd':
debug_flag=atoi(optarg); /* print address in output */
break;
所以发生的事情是你正在调用atoi(0)
,这就是分段错误。
这是手册页中的示例,注意“b”后面没有a 冒号而“f”是。
#include <unistd.h>
int bflag, ch, fd;
bflag = 0;
while ((ch = getopt(argc, argv, "bf:")) != -1) {
switch (ch) {
case 'b':
bflag = 1;
break;
case 'f':
if ((fd = open(optarg, O_RDONLY, 0)) < 0) {
(void)fprintf(stderr,
"myname: %s: %s\n", optarg, strerror(errno));
exit(1);
}
break;
case '?':
default:
usage();
}
}
argc -= optind;
argv += optind;
答案 1 :(得分:1)
这可能对其他人有用:如果你指定一个没有冒号的选项字母,并且使用冒号,你也会得到一个段错误,例如&#34; dabcd:e&#34; - 在这种情况下&#34; d&#34;有和没有冒号....然后使用该选项字母。
看来getopt及其变体不会检查此冲突并返回错误!