LINUX.ORG.RU

Язык - C++

ShTH
() автор топика

int main(int argc, char** argv)

argc - число аргументов переданых программе

argv - указатель на массив аргументов

парсите..

anonymous
()
Ответ на: комментарий от roy

>getopt - parse command options (enhanced)

Причем почти в каждом языке, в том или ином виде имеется.

fat_angel ★★★★★
()
Ответ на: комментарий от andreyu

Угу, и вручную разбирать, какой тип параметров (short или long), могут или не могут иметь значения. И всё ради того, чтобы не использовать стандартную функцию.

roy ★★★★★
()
Ответ на: комментарий от roy

А как парсить символьные аргументы? что-то не совсем понял. Во всех примерах показаны числа, а вот использовать символьный массив не удалось.Если можно, пример программы с несколькими символьными аргументами.

ShTH
() автор топика
Ответ на: комментарий от ShTH

Не знаю, так ли я понял вопрос, но вот пример кода:

while ( (rez = getopt(argc, argv, "DhvP:b:c:dris:p:t:f:u:S:Vq:M:N:x:X:z:l:")) != -1) {
                switch (rez) {
                        case 'h':
                                ShowUsage(argv[0]);
                                return NULL;
                                
                        case 'v':
                                printf("%s, version %s\n", argv[0], VERSION);
                                return NULL;
                                
                        case 'D':
                                param->daemon = 1;
                                break;
...
                        case 'b':
                                if (strlen(optarg) > STR_BUF) {
                                        PErr("base file name too long");
                                        return NULL;
                                }
                                strncpy(param->file_base, optarg, STR_BUF);
                                break;


roy ★★★★★
()
Ответ на: комментарий от roy

Нет. Что-то аналогичное башизму:


help()
{     echo "use -h , v"}
version()
{ echo "version 1" } 

case "$1" in




-h)  
help()
;;
-v)
version()
;;

esac


ShTH
() автор топика
Ответ на: комментарий от ShTH

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

ShTH
() автор топика
Ответ на: комментарий от ShTH

вот странный человек. в мане это разжовано до немогу (покрайней мере в бсдяшном).

ну что ж, вот тебе то, что ты просил:

void
usage(void)
{
        extern char *__progname;

        fprintf(stderr, "usage: %s -h, v\n", __progname);
        exit(1);
}

int
main(int argc, char **argv)
{
        char *string;
        int number;
        int c;

        while ((c = getopt(argc, argv, "n:s:hv")
                switch (c) {
                case 'n':
                        number = atoi(optarg);
                        break;
                case 's':
                        string = strdup(optarg);
                        break;
                case 'v':
                        fprintf(stderr, "version 1\n");
                        break;
                case 'h':
                default:
                        usage();
                        /* NOTREACHED */
                }

        argc -= optind;
        argv += optind;

        if (argc) {
                printf("there are some more args\n");
                while (*argv)
                        printf("arg: %s\n", *argv++);
        }

        return 0;
}

теперь разбирайся сам — это полный пример

beastie ★★★★★
()
Ответ на: комментарий от roy

> Угу, и вручную разбирать, какой тип параметров (short или long), могут или не могут иметь значения. И всё ради того, чтобы не использовать стандартную функцию.

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

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

И да, мой вариант решения работает на множестве платформ и не требует ничего лишнего.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

> Ваше предложение?

Очевидно, не изобретать велосипедов с треугольными колёсами. NIH-синдром до добра не доводит. Есть getopt.

kemm
()
Ответ на: комментарий от kemm

> Очевидно, не изобретать велосипедов с треугольными колёсами. NIH-синдром до добра не доводит. Есть getopt.

Вот скажите, чем он лучше моего решения. Варианты вида, "потому, что иначе я не умею" меня не устроят.

andreyu ★★★★★
()

Ратую за boost::program_options.
И декларативненько, и само help message генерит.

l5k
()
Ответ на: комментарий от kemm

> Всем. Он стандартен. Он отлажен. Он прям. Он работает.

То бишь мой вариант не работает, и только ваш самый правильный?.. ;)

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

> То бишь мой вариант не работает

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

> только ваш самый правильный?.. ;)

Это стандартный вариант. Ваш NIH-синдром в активной фазе интересен разве что людям других профессий.

kemm
()
Ответ на: комментарий от kemm

> Не работает, конечно. Его просто-напросто нет. Есть некий псевдокод, который надо раскопипастить

Мой код работает, в отличие от вашего (ведь кроме имени функции вы вообще ничего не привели). Копипастить там нужно столько же, сколько и для case 'x'.

> и каждый раз при изменении параметров мучительно менять. Не говоря уже о последующих написаниях других программок.


Весьма вероятно, что для вас это мучительно. Вы часом не дельфист мечтающий о компоненте (или кнопке прямо в IDE) - "сделать пиз..то"?

> Это стандартный вариант. Ваш NIH-синдром в активной фазе интересен разве что людям других профессий.


Про вашу профессию "философа", изучающего некий NIH-синдром удаленно я уже понял. Тут можно не продолжать. Вы вместо аргументов бросаетесь обрывками фраз стиля - "круто. правильно. я так сказал".
Так же я понял, что если что то делается не по вашему (вероятно весьма строгому) алгоритму, то это не правильно. Но поверьте, решений бывает много.

p.s. Продолжать дальнейшую дискуссию мне с вами не интересно, т.ч. не утруждайтесь.

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.