Есть ли функция, которая могла бы заменить atoi в C++. Я провел некоторое исследование и не нашел ничего, что могло бы его заменить, единственными решениями было бы использование cstdlib или его реализация самостоятельно.
эквивалент атои
Ответы (6)
Если вы не хотите использовать Boost, C++11 добавил std::stoi
для строк. . Подобные методы существуют для всех типов.
std::string s = "123"
int num = std::stoi(s);
В отличие от atoi
, если преобразование невозможно, выдается исключение invalid_argument
. Кроме того, если значение выходит за пределы диапазона для int, генерируется исключение out_of_range
. .
to_int
и to_long
или что-то в этом роде, но я думаю, что это почти так же хорошо.
- person Steve Summit; 22.12.2015
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
}
}
boost::lexical_cast
может бросить, поэтому окружите его try-catch, чтобы сделать его более полным.
- person Nawaz; 13.08.2011
Вы можете использовать функцию Boost boost::lexical_cast‹> следующим образом:
char* numericString = "911";
int num = boost::lexical_cast<int>( numericString );
Дополнительную информацию можно найти здесь (последняя версия Boost 1.47 ). Не забывайте правильно обрабатывать исключения.
Без повышения:stringstream ss(my_string_with_a_number); int my_res; ss >> my_res;
Примерно так же раздражает, как версия с усилением, но без дополнительной зависимости. Может быть, тратить больше оперативной памяти.
std::string s="8978x9"
. Ваш подход потерпит неудачу, не уведомив вас. С другой стороны, boost::lexical_cast
выдаст исключение, и вы об этом узнаете! И повышение не раздражает, как уже сказал @Armen.
- person Nawaz; 13.08.2011
char x; if (!(ss >> x)) /*success*/
- person kapace; 13.02.2013
"8978x9"
, то ss
будет читать только 8978
, не сообщая вам о проблеме, заключающейся в том, что строка содержит 'x'
, что является недопустимой цифрой. См. демонстрацию в Интернете
- person Nawaz; 13.02.2013
Вы не говорите, почему atoi
не подходит, поэтому я предполагаю, что это как-то связано с производительностью. В любом случае, уточнение не помешало бы.
Использование Boost Spirit.Qi примерно на порядок быстрее, чем atoi
, по крайней мере, в тесты, проведенные Алексом Оттом.
У меня нет эталона, но в последний раз, когда я тестировал его, Boost lexical_cast
был примерно на порядок медленнее, чем atoi
. Я думаю, причина в том, что он создает строковый поток, что довольно дорого.
Обновление: несколько новых тестов
atoi
не подходит из-за его поведения с недопустимым аргументом (я считаю, что поведение не определено).
- person Keith Thompson; 27.08.2013
Вы можете использовать функцию stoi();
#include <string>
// Need to include the <string> library to use stoi
int main(){
std::string s = "10";
int n = stoi(s);
}
Чтобы на самом деле скомпилировать это, вам нужно включить С++ 11, посмотреть в Google, как это сделать (в коде:: блоки это: Настройки -> Компилятор -> «Имейте g++ следовать стандарту языка С++ 11 ISO С++») Если вы компилируете из терминала, вам нужно добавить -std=c++11
g++ -std=c++11 -o program program.cpp
atoi
небезопасно! Он не обрабатывает недопустимый ввод. Также он может использовать еще много других утилит от boost. - person Nawaz   schedule 13.08.2011<cstdlib>
является полностью допустимой частью C++. Скажиstd::atoi
, если тебе от этого станет легче :-) - person Kerrek SB   schedule 13.08.2011atoi
не обрабатывает недопустимый ввод. - person Nawaz   schedule 13.08.2011<cstdlib>
, не означает, чтоstd::atoi
безопасен (если вы подразумеваете это в своем комментарии). Stdlib также включает<cstdio>
, но это не значит, что нужно использоватьstd::scanf
иstd::prinf
вместоstd::cin
иstd::cout
. - person Nawaz   schedule 13.08.2011boost::lexical_cast
выполняет как проверку ввода, так и преобразование. Если вы используетеatoi
, вам нужно написать код, который уже делаетboost::lexical_cast
. Кроме того, если вы хотите написать код для проверки того, является ли строка допустимой дляatoi
или нет, то почему бы не преобразовать ее самостоятельно? Зачем вообще использоватьatoi
? - person Nawaz   schedule 13.08.2011atoi
очень плохой интерфейс.strtol
является подходящей заменой не потому, что он делает что-то другое — нет, а потому, что у него есть интерфейс, позволяющий проверить, произошло ли успешное преобразование. Я действительно не понимаю аргумент @JesusRamos о том, что вы должны написать больше кода для проверки ввода, прежде чем передавать его в функцию преобразования. Разве написать функцию, которая определяет, может ли строка быть преобразована в число, не так же сложно, как написать функцию, которая выполняет это преобразование? В таком случае, почему бы не использовать библиотечную функцию, которая делает и то, и другое. - person CB Bailey   schedule 13.08.2011int
перед передачей егоatoi
точно так же сложна, как и самatoi
. На самом деле, несмотря на то, что можно предварительно проверить синтаксис ввода, практически невозможно поймать переполнение без фактического преобразования. По этой причинеatoi
является мертвой функцией, которая не используется в реальном коде. Практически любой код, использующийatoi
, не работает только по этой причине. Преобразование строк в целые числа в языке C всегда выполнялось исключительноstrto...
функциями. У них нет альтернатив в стандартной библиотеке C. - person AnT   schedule 27.08.2013atoi
, так как вы не должны были использоватьatoi
в первую очередь. Всегда. Вам нужен эквивалентstrto...
функций. Хотя эти функции доступны и в C++, лучшим вариантом может бытьlexical_cast
. - person AnT   schedule 27.08.2013