Как я могу обработать аргументы в c с getopt_long - PullRequest
1 голос
/ 23 декабря 2011

Я не совсем понимаю, как я могу правильно обрабатывать аргументы командной строки в c, используя функцию getopt_long, я создаю этот код:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>

int main(int argc, char** argv) {
    int next_option;
    /* String of short options */
    const char *short_options = "hl:k";
    /* The array of long options */
    const struct option long_options[] = {
        { "help",  0, NULL, 'h' },
        { "launch", 1, NULL, 'l' },
        { "kill",  0, NULL, 'k' },
        { NULL,    0, NULL, 0   } 
    };

    do {
        next_option = getopt_long(argc, argv, short_options, long_options, NULL);
        switch (next_option) {
            case 'h':
                /* User requested help */
                fprintf(stdout, "HELP\n");
                break;
            case 'l':
                fprintf(stdout, "launching\n");
                fprintf(stdout, "Want to launch on port %s\n",\
                        optarg);
                break;
            case 'k':
                fprintf(stdout, "KILLING\n");
                break;
            case '?':
                /* The user specified an invalid option */
                fprintf(stdout, "Requested arg does not exist!\n");
                exit(EXIT_FAILURE);
            case -1:
                /* Done with options */
                break;

            default:
                /* Unexpected things */
                fprintf(stdout, "I can't handle this arg!\n");
                exit(EXIT_FAILURE);
        }
    } while(next_option != -1);

    return (EXIT_SUCCESS);
}

И вывод странный, потому что мы можем передавать данные мусора какаргументы командной строки и моя программа не проверяют эти ошибки!Как я могу это исправить.

Пример выполнения:

$ ./command_line -h garbage
HELP
$ ./command_line --help garbage
HELP
$ ./command_line --launch 1200 garbage
launching
Want to launch on port 1200
$ ./command_line --lBADARG 1200
command_line: unrecognized option `--lBADARG'
Requested arg does not exist!
$ ./command_line -lBADARG 1200
launching
Want to launch on port BADARG

Спасибо за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011

Хорошо, что происходит, это:

в данном случае:

$ ./command_line --lBADARG 1200
command_line: unrecognized option `--lBADARG'
Requested arg does not exist!

выдавая --lBADARG вы говорите, ищите ДЛИТЕЛЬНЫЙ аргумент lBADARG, а у вас его нет.

в этом случае:

$ ./command_line -lBADARG 1200
launching
Want to launch on port BADARG

Вы успешно указываете использовать флаг -l, который имеет аргумент. Он ведет себя, как и ожидалось, сообщая, что аргумент BADARG.

Если вы попробуете

$ ./command_line -l 1200

или

$ ./command_line -l1200

или

$ ./command_line --launch 1200

это должно делать то, что вы ожидаете. И если вы хотите получить аргументы, которые являются , а не параметрами, вы найдете их в векторе argv после того, как вы выполнили обработку getopt, потому что getopt_long удобно переставляет вектор argv оставить там неопционные аргументы.

0 голосов
/ 23 декабря 2011

Причина, по которой garbage проходит нормально, в том, что getopt и его братья предназначены для обработки опций, не всех аргументов команды lne.Не все аргументы являются опциями.

Причина, по которой --lBADARG трактуется иначе, чем -lBADARG, заключается в том, как он хочет с ними работать.--lBADARG - это опция lBADARG без параметров, а -lBADARG - это опция -l с параметром BADARG.Первый не указан в качестве допустимого параметра, но последний имеет вид.

И последняя возможная проблема заключается в том, что BADARG рассматривается как порт.Это связано с тем, что getopt не знает и не заботится о типах параметров , , это зависит от вашего кода.Если вы хотите убедиться, что он числовой, вы должны проверить это.Вполне может быть, что вы хотите поддерживать символические имена портов (например, посмотрите в /etc/ports).

...