Случай переключения не влияет на переменную C - PullRequest
0 голосов
/ 11 декабря 2018
int main (int argc, char **argv) {
    //Initialise variable for switch option
    int option = 0;
    //Set time to default to epoch
    char *argtime = "1970-01-01 00:00:00";
    //Use getopt to parse switches t and h (neither requires an argument, as epoch is defaulted to if non is supplied)
    while ((option = getopt(argc, argv, "th")) != -1) {
        //Switch statements for supplied switches
        switch (option) {
            //If -t
            case 't':
                //If arg supplied
                if(optarg != NULL) {
                    //Set arg to given arg 
                    argtime = optarg;
                }
                printf("-t is selected.\n");
                break;
            //If -h
            case 'h':
                printf("Help is selected\n");
                break;
            //If anything else
            default:
                printf("Option invalid\n");
                return 1;
        }
    }
    printf("The set time is %s\n", argtime);
    return 0;
}

Вот некоторый код, который я написал, чтобы использовать getopt () для анализа ключа командной строки и аргумента.Я хочу, чтобы по умолчанию argtime было установлено значение «1970-01-01 00:00:00», если аргумент не указан, что происходит, но когда я использую переключатель -t и предоставляю другой аргумент, argtime остается неизменным.Так что в основном argtime = optarg; делает не то, что должно, но я не знаю почему.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

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

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

int main (int argc, char **argv) {
    //Initialise variable for switch option
    int option = 0;
    //Set time to default to epoch
    char *argtime = "1970-01-01 00:00:00";
    //Use getopt to parse switches t and h (neither requires an argument, as epoch is defaulted to if non is supplied)
    while ((option = getopt(argc, argv, "th")) != -1) {
        //Switch statements for supplied switches
        switch (option) {
            //If -t
            case 't':
                //If arg supplied
                printf("-t is selected.\n");
                break;
            //If -h
            case 'h':
                printf("Help is selected\n");
                break;
            //If anything else
            default:
                printf("Option invalid\n");
                return 1;
        }
    }
    if ( optind < argc) {//more arguments available
        //Set arg to given arg
        argtime = argv[optind];
    }

    printf("The set time is %s\n", argtime);
    return 0;
}
0 голосов
/ 11 декабря 2018

Вам необходимо сообщить getopt() о параметрах, которые требуют аргумента.Как описано в комментариях @xing, вы делаете это, помещая двоеточие в строку параметра после соответствующей буквы.Это позволяет getopt() правильно обрабатывать сгруппированные параметры и распознавать неопционные параметры.Только если вы сделаете это, вы можете ожидать, что аргументы опции будут сообщены вам через optarg.

. Вы заявляете в комментариях, что хотите указать необязательный аргумент опции.Стандарт POSIX getopt() не предусматривает этого.В вашем конкретном случае непонятно, зачем вам это вообще нужно, что будет означать указание опции -t без аргумента?Что программа должна использовать по умолчанию?Но это то, что он будет делать, если -t будет вообще опущен.

Тем не менее, способ подойти к ситуации с POSIX getopt() состоит в том, чтобы предоставить две отдельные опции, одну, которая принимает аргумент, и другую, которая не 'т.Например, вы можете использовать опцию -T, чтобы обозначить все, что вы хотели -t без опции, означающей (getopt(argc, argv, "t:Th")).В качестве альтернативы, если вы хотите положиться на расширения GNU, вы можете указать необязательный аргумент option через двойное двоеточие (getopt(argc, argv, "t::h")), но это менее переносимо и имеет немного другую семантику.

...