Ошибка сегментации — ошибка дампа ядра при использовании getopt

Я знаю, что этот квестон задавался несколько раз, но я все еще не могу понять

#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

Я получаю ошибку сброса ядра. Я прочитал несколько примеров в Google, но все еще сталкиваюсь с этой проблемой. Может кто-нибудь, пожалуйста, помогите?

1

Решение

Вам нужно прочитать справочную страницу для getopt ()

  while ((ch = getopt(argc, argv, "dhlprtns")) != -1)
^^^^^^^^

Это не соответствует тому, как вы используете аргументы. Вы
хотите двоеточия «:» после флагов, которые ожидают аргументов. В вашем коде
«d» не следует за двоеточием, и, тем не менее, вам, кажется, нужно значение для него:

  case 'd':
debug_flag=atoi(optarg);        /* print address in output */
break;

Итак, что происходит, вы звоните atoi(0) и это ошибка.

Вот пример со страницы руководства, обратите внимание, что «b» не сопровождается
двоеточие в то время как «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;
8

Другие решения

Это может быть полезно для других: вы также получите segfault, если укажите опционную букву как без двоеточия, так и с двоеточием, например, «dabcd: e» — в этом случае «d» встречается с двоеточием и без него …. и затем используйте этот вариант письма.

Похоже, getopt и его варианты не проверяют этот конфликт и возвращают ошибку!

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector