Как преобразовать аргумент командной строки в int?
Мне нужно получить аргумент и преобразовать его в int. Вот мой код:
#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
}
Ответы
Ответ 1
Поскольку этот ответ был каким-то образом принят и, таким образом, будет отображаться наверху, хотя он не самый лучший, я улучшил его, основываясь на других ответах и комментариях.
Путь C; проще всего, но будет обрабатывать любое недопустимое число как 0:
#include <cstdlib>
int x = atoi(argv[1]);
C с проверкой ввода:
#include <cstdlib>
char *endptr;
long int x = strtol(argv[1], &endptr, 10);
if (!*argv[1] || *endptr)
cerr << "Invalid number " << argv[1] << '\n';
Способ С++ с проверкой ввода:
#include <sstream>
istringstream ss(argv[1]);
int x;
if (!(ss >> x))
cerr << "Invalid number " << argv[1] << '\n';
Все три варианта предполагают, что argc >= 2
.
Ответ 2
Обратите внимание, что аргументы 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;
}
Ответ 3
Как отметил 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
(т.е. начало части, которую он не смог преобразовать в число).
Поскольку вы используете С++, вы также можете использовать boost::lexical_cast
. Это почти так же просто, как atoi
, но также обеспечивает (примерно) тот же уровень детализации при сообщениях об ошибках как strtol
. Самый большой расход заключается в том, что он может генерировать исключения, поэтому для его использования ваш код должен быть безопасным для исключений. Если вы пишете С++, вы все равно должны это делать, но это как бы заставляет проблему.
Ответ 4
std:: stoi from string также можно использовать.
#include <string>
using namespace std;
int main (int argc, char** argv)
{
if (argc >= 2)
{
int val = stoi(argv[1]);
// ...
}
return 0;
}
Ответ 5
Посмотрите на strtol(), если вы используете стандартную библиотеку C.
Ответ 6
Подход с istringstream может быть улучшен, чтобы проверить, что после ожидаемого аргумента не были вставлены другие символы:
#include <sstream>
int main(int argc, char *argv[])
{
if (argc >= 2)
{
std::istringstream iss( argv[1] );
int val;
if ((iss >> val) && iss.eof()) // Check eofbit
{
// Conversion successful
}
}
return 0;
}