Аргументы командной строки не работают - пропускает их полностью - PullRequest
3 голосов
/ 14 января 2009

Хорошо, я пытаюсь заставить аргументы правильно работать с небольшим тестовым приложением. Мой код ниже. Я не слишком опытен в C ++, поэтому я не уверен, почему, когда я запускаю тест с -print (или --print), он автоматически сообщает «Недопустимая опция» и затем завершает работу.

#include <iostream>

int main(int argc, char* argv[])
{
    int option;
    option = 1;
    char* argument;
    argument = argv[option];
    while (option < argc)
    {
        if (argument == "-print")
        {
            std::cout << "Printing Extra Text";
        }
        else
        {
            std::cout << "Not a valid option" << std::endl;
        }
        option++;
    }
    std::cout << "Printing normal text" << std::endl;
    return 0;
}

Я правильно делаю? Заранее спасибо.

Ответы [ 6 ]

12 голосов
/ 14 января 2009

Вы сравниваете адрес памяти строки "-print" с адресом памяти argument. Это не сработает! Используйте strcmp() для сравнения строковых значений. Вместо:

if (argument == "-print")

сделать

if (strcmp(argument, "-print") == 0)
8 голосов
/ 14 января 2009

Ошибка следующей строки:

if (argument == "-print")

Здесь вы сравниваете указатели, а не строковые значения. Заменить на:

if (strcmp(argument, "-print") == 0)

C / C ++ ведет себя иначе, чем Java или C # в отношении обработки строк. Строки не являются нативным типом или объектом, а просто прославляют указатели на массивы символов.

В качестве альтернативы, и если ваш список параметров становится более сложным, рассмотрите возможность использования выделенной библиотеки анализа параметров, такой как Boost ' Program_options . Он будет обрабатывать все аспекты, включая проверку и пользовательские сообщения.

2 голосов
/ 14 января 2009

Я давно программировал на C ++, но не стоит ли просто использовать

std::string argument;

и тогда сработает сравнение с ==?

1 голос
/ 14 января 2009

Есть еще одна проблема, когда вы читаете аргумент. (со всеми необходимыми изменениями)

int main(int argc, char* argv[])
{
    int option;
    option = 1;
    char* argument;
    while (option < argc)
    {
        argument = argv[option];
        if (strcmp(argument, "-print") == 0)
        {
            std::cout << "Printing Extra Text";
        }
        else
        {
            std::cout << "Not a valid option" << std::endl;
        }
        option++;
    }
    std::cout << "Printing normal text" << std::endl;
    return 0;
}
1 голос
/ 14 января 2009

В вашем вопросе говорится, что вы также хотите проверить на --print (две черты), но ваш код не проверяет это.

Кроме того, вы назначаете аргумент вне цикла, вы захотите сделать это внутри цикла, иначе вы будете проверять аргумент № 1 каждый раз вокруг цикла.

1 голос
/ 14 января 2009
if (argument == "-print")

Вы не можете сравнивать подобные строки!

Используйте strcmp () для сравнения строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...