getopt всегда возвращает -1, если начинается с третьего аргумента - PullRequest
2 голосов
/ 20 февраля 2020

Я делаю простую консоль, которая делает что-то, основываясь на команде второго аргумента. Ниже приведен упрощенный код. Моя консоль, однако, не печатает NSLog, и после проверки opt всегда -1.

Использование myconsole firstMethod -t "this is a test string"

int main(int argc, char *argv[], char *envp[]) {

    NSString *stringArgument = [NSString stringWithFormat:@"%s", argv[1]];

    if([stringArgument caseInsensitiveCompare:@"firstMethod"] == NSOrderedSame) {
        extern char *optarg;
        extern int optind;
        int opt;

        while ((opt = getopt(argc, argv, "t:")) != -1) {
            switch (opt){
                case 't':
                    NSLog(@"Case t");
                break;
                default:
                    NSLog(@"Default");
            }
        }
    }
}

Любая идея, почему это не удалось ? Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

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

Если вы всегда если первый аргумент не является опцией (например, одно имя команды), вы можете передать измененный (с помощью одного аргумента) вектор аргумента в getopt() следующим образом:

while ((opt = getopt(argc-1, argv+1, "t:")) != -1){

Затем Первый аргумент (который не является опцией в вашем случае) должен быть пропущен.

1 голос
/ 20 февраля 2020

Вы должны использовать Foundation классы вместо getopt, если вы разрабатываете консольное приложение в Objective- C. С NSUserDefaults вы можете найти значение для t намного проще:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *valueForT = [userDefaults stringForKey:@"t"];
NSLog(@"%@", valueForT);

Чтобы проверить, передал ли пользователь firstMethod в консольное приложение, используйте NSProcessInfo:

NSArray<NSString*> *arguments = [[NSProcessInfo processInfo] arguments];
if (arguments.count >= 2) {
    NSLog(@"%@", arguments[1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...