Объединить параметры с аргументами getopt

Привет, я пишу программу, которая принимает несколько параметров из командной строки в c. Вот некоторые из вариантов:

-l   counts number of lines in file
-w   counts words in file
-c   counts characters in file

чтобы заставить их работать, вы можете сделать:

./program -l file.txt
./program -w file.txt
./program -c file.txt

однако я хочу объединить их так, чтобы несколько вариантов по-прежнему работали как надо. например:

./program -lwc file.txt

будет считать строки, слова и файлы AND,

./program -lw file.txt

будет считать строки и слова,

./program -cl file.txt

будет считать символы и строки и т. д. Я просто не могу понять, как это сделать. это мой код для аргументов:

while ( ( c = getopt( argc, argv, "c:w:l:" ) ) != -1 ) { /* get options */
    switch ( c ) {
        case 'c':
            cflag = 1;
            break;
        case 'w':
            wflag = 2;
            break;
        case 'l':
            lflag = 3;
            break;
    }   
}

это просто изменение вариантов вокруг, но это все еще не работает. с кодом, который я имею сейчас, объединение двух вариантов приводит к ошибке сегмента. любая помощь приветствуется

2 ответа

Решение

Как сказал Йенс Гастдт: уберите двоеточия из опций, чтобы они не принимали аргумент. Затем, когда обработка опций завершена (т.е. getopt возвращенный -1), проверить, если optind меньше чем argc это значит, что был дополнительный аргумент (ваше имя файла). Как это:

/* after the while-loop */
if(optind < argc){
    fileName = argv[optind];
    optind++;
}else{
    perror("No file specified");
    return -1;
}

когда getopt готово optind указывает на первую запись в argv это не было обработано getopt,

: в getopt Формат для вариантов с аргументами. Удалить их.

Другие вопросы по тегам