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

Эквивалент atoi

Есть ли функция, которая может заменить atoi в С++. Я сделал некоторые исследования и не нашел ничего, чтобы заменить его, единственные решения будут использовать cstdlib или реализовать его сам.

4b9b3361

Ответ 1

Если вы не хотите использовать Boost, С++ 11 добавил std::stoi для строк. Подобные методы существуют для всех типов.

std::string s = "123"
int num = std::stoi(s);

В отличие от atoi, если преобразование не может быть выполнено, генерируется исключение invalid_argument. Кроме того, если значение вне диапазона для int, генерируется исключение out_of_range.

Ответ 2

boost::lexical_cast является вашим другом

#include <string>
#include <boost/lexical_cast.hpp>

int main()
{
    std::string s = "123";
    try
    {
       int i = boost::lexical_cast<int>(s); //i == 123
    }
    catch(const boost::bad_lexical_cast&)
    {
        //incorrect format   
    }
}

Ответ 3

Вы можете использовать функцию Boost boost:: lexical_cast < > следующим образом:

char* numericString = "911";
int num = boost::lexical_cast<int>( numericString );

Более подробную информацию можно найти здесь (последняя версия Boost 1.47). Не забудьте обработать исключения соответствующим образом.

Ответ 4

Без повышения:
stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
Примерно так же раздражает, как и версия boost, но без дополнительной зависимости. Возможно, может быть больше отходов.

Ответ 5

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

Использование Boost Spirit.Qi примерно на порядок быстрее, чем atoi, по крайней мере, в тестах, выполненных Alex Ott.

У меня нет ссылки, но в последний раз, когда я ее тестировал, Boost lexical_cast был примерно на порядок медленнее, чем atoi. Я думаю, причина в том, что он строит stringstream, что довольно дорого.

Обновить: Несколько новых тестов

Ответ 6

Вы можете использовать функцию stoi();

#include <string> 
// Need to include the <string> library to use stoi

int mani(){

   std::string s = "10";
   int n = stoi(s);

}

Чтобы на самом деле скомпилировать это, вам нужно будет включить С++ 11, посмотрите на google, как это сделать (на code:: blocks это: Настройки → Компилятор → "Имейте g++ следуйте С++ 11 ISO С++ language стандарт" ) Если вы скомпилируете с терминала, вам нужно добавить -std = С++ 11

g++ -std=c++11 -o program program.cpp