Как преобразовать параметр командной строки в интервал?

Я должен получить аргумент и преобразовать его в интервал. Вот мой код до сих пор:

#include <iostream>


using namespace std;
int main(int argc,int argvx[]) {
    int i=1;
    int answer = 23;
    int temp;

    // decode arguments
    if(argc < 2) {
        printf("You must provide at least one argument\n");
        exit(0);
    }

    // Convert it to an int here

}
53
задан BartoszKP 8 February 2015 в 11:23
поделиться

4 ответа

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

Путь C; самый простой, но будет обрабатывать любое недопустимое число как 0:

#include <cstdlib>

int x = atoi(argv[1]);

Способ C с проверкой ввода:

#include <cstdlib>

errno = 0;
char *endptr;
long int x = strtol(argv[1], &endptr, 10);
if (endptr == argv[1]) {
  std::cerr << "Invalid number: " << argv[1] << '\n';
} else if (*endptr) {
  std::cerr << "Trailing characters after number: " << argv[1] << '\n';
} else if (errno == ERANGE) {
  std::cerr << "Number out of range: " << argv[1] << '\n';
}

Способ iostreams C ++ с проверкой ввода:

#include <sstream>

std::istringstream ss(argv[1]);
int x;
if (!(ss >> x)) {
  std::cerr << "Invalid number: " << argv[1] << '\n';
} else if (!ss.eof()) {
  std::cerr << "Trailing characters after number: " << argv[1] << '\n';
}

Альтернативный способ C ++, начиная с C ++ 11:

#include <stdexcept>
#include <string>

std::string arg = argv[1];
try {
  std::size_t pos;
  int x = std::stoi(arg, &pos);
  if (pos < arg.size()) {
    std::cerr << "Trailing characters after number: " << arg << '\n';
  }
} catch (std::invalid_argument const &ex) {
  std::cerr << "Invalid number: " << arg << '\n';
} catch (std::out_of_range const &ex) {
  std::cerr << "Number out of range: " << arg << '\n';
}

Все четыре варианта Предположим, что argc> = 2 . Все принимают пробелы в начале; проверьте isspace (argv [1] [0]) , если вы этого не хотите. Все, кроме atoi , отклоняют завершающие пробелы.

83
ответ дан 7 November 2019 в 08:31
поделиться

Обратите внимание, что ваши аргументы main неверны. Стандартная форма должна быть:

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

или, что эквивалентно:

int main(int argc, char **argv)

Есть много способов выполнить преобразование. Это один из подходов:

#include <sstream>

int main(int argc, char *argv[])
{
    if (argc >= 2)
    {
        std::istringstream iss( argv[1] );
        int val;

        if (iss >> val)
        {
            // Conversion successful
        }
    }

    return 0;
}
23
ответ дан 7 November 2019 в 08:31
поделиться

Как указал WhirlWind, рекомендации по использованию atoi на самом деле не очень хороши. atoi не имеет возможности указать ошибку, поэтому вы получите тот же результат от atoi ("0"); , как и от atoi ("abc"); . Первое явно имеет смысл, но второе - явная ошибка.

Он также рекомендовал strtol , что вполне нормально, хотя и немного неуклюже. Другой вариант - использовать sscanf , что-то вроде:

if (1==sscanf(argv[1], "%d", &temp))
    // successful conversion
else
    // couldn't convert input

обратите внимание, что strtol действительно дает немного более подробные результаты - в частности, если у вас есть аргумент вроде 123abc , вызов sscanf просто скажет, что он преобразовал число (123), тогда как strtol не только сообщит вам, что он преобразовал число, но также укажет на a (т. е. начало части, которую можно не преобразовать в число).

Поскольку вы используете C ++, вы также можете рассмотреть возможность использования boost :: lexical_cast . Его почти так же просто использовать, как atoi , но он также обеспечивает (примерно) такой же уровень детализации при сообщении об ошибках, что и strtol . Самая большая трата заключается в том, что он может генерировать исключения, поэтому для его использования ваш код должен быть безопасным для исключений. Если вы пишете на C ++, вы все равно должны это сделать, но это как бы форсирует проблему.

3
ответ дан 7 November 2019 в 08:31
поделиться

Взгляните на strtol (), если вы используете стандартную библиотеку C.

1
ответ дан 7 November 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: