эквивалент атои - PullRequest
       5

эквивалент атои

25 голосов
/ 13 августа 2011

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

Ответы [ 6 ]

17 голосов
/ 28 мая 2014

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

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

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

9 голосов
/ 13 августа 2011

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   
    }
}
4 голосов
/ 13 августа 2011

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

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

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

3 голосов
/ 13 августа 2011

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

2 голосов
/ 13 августа 2011

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

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

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

Обновление : Некоторые более поздние тесты

0 голосов
/ 13 июля 2016

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

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

int mani(){

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

}

Чтобы скомпилировать это, вам нужно включить c ++ 11, посмотрите на Google, как это сделать (накод :: блокирует это: Настройки -> Компилятор -> «Пусть g ++ следует стандарту языка C ++ 11 ISO C ++») Если вы компилируете из терминала, вы должны добавить -std = c ++ 11

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