Подтвердить что ты не робот

Как преобразовать аргумент командной строки в 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

}
4b9b3361

Ответ 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;
}