Есть ли функция, которая может заменить atoi в С++. Я сделал некоторые исследования и не нашел ничего, чтобы заменить его, единственные решения будут использовать cstdlib или реализовать его сам.
Эквивалент atoi
Ответ 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