С++ parse int из строки
Возможный дубликат:
Как разбирать строку в int на С++?
Я провел некоторое исследование, и некоторые люди говорят, что используют atio, а другие говорят, что это плохо, и я не могу заставить его работать в любом случае.
Таким образом, я просто хочу спросить, как правильно преобразовать строку в int.
string s = "10";
int i = s....?
Спасибо!
Ответы
Ответ 1
-
В С++ 11 используйте std::stoi
как:
std::string s = "10";
int i = std::stoi(s);
Обратите внимание, что std::stoi
генерирует исключение типа std::invalid_argument
, если преобразование не может быть выполнено, или std::out_of_range
, если преобразование приводит к переполнению (т.е. когда строковое значение слишком велико для типа int
). Вы можете использовать std::stol
или std:stoll
, хотя в case int
кажется слишком малым для входной строки.
-
В С++ 03/98 можно использовать любое из следующих:
std::string s = "10";
int i;
//approach one
std::istringstream(s) >> i; //i is 10 after this
//approach two
sscanf(s.c_str(), "%d", &i); //i is 10 after this
Обратите внимание, что вышеприведенные два подхода не будут введены для ввода s = "10jh"
. Они возвратят 10 вместо уведомления об ошибке. Таким образом, безопасный и надежный подход заключается в том, чтобы написать свою собственную функцию, которая анализирует входную строку и проверяет каждый символ, чтобы проверить, является ли он цифрой или нет, а затем работать соответствующим образом. Вот одна надежная реализация (непроверенная):
int to_int(char const *s)
{
if ( s == NULL || *s == '\0' )
throw std::invalid_argument("null or empty string argument");
bool negate = (s[0] == '-');
if ( *s == '+' || *s == '-' )
++s;
if ( *s == '\0')
throw std::invalid_argument("sign character only.");
int result = 0;
while(*s)
{
if ( *s >= '0' && *s <= '9' )
{
result = result * 10 - (*s - '0'); //assume negative number
}
else
throw std::invalid_argument("invalid input string");
++s;
}
return negate ? result : -result; //-result is positive!
}
Это решение является слегка измененной версией моего другого решения.
Ответ 2
Вы можете использовать boost:: lexical_cast:
#include <iostream>
#include <boost/lexical_cast.hpp>
int main( int argc, char* argv[] ){
std::string s1 = "10";
std::string s2 = "abc";
int i;
try {
i = boost::lexical_cast<int>( s1 );
}
catch( boost::bad_lexical_cast & e ){
std::cout << "Exception caught : " << e.what() << std::endl;
}
try {
i = boost::lexical_cast<int>( s2 );
}
catch( boost::bad_lexical_cast & e ){
std::cout << "Exception caught : " << e.what() << std::endl;
}
return 0;
}
Ответ 3
Нет "правильного пути". Если вы хотите универсальное (но субоптимальное) решение, вы можете использовать boost:: lexical cast.
Общим решением для С++ является использование std:: ostream и < оператор. Вы можете использовать метод stringstream и stringstream:: str() для преобразования в строку.
Если вам действительно нужен быстрый механизм (помните правило 20/80), вы можете искать "выделенное" решение, например http://www.partow.net/programming/strtk/index.html
С наилучшими пожеланиями,
Marcin
Ответ 4
Вы можете использовать istringstream.
string s = "10";
// create an input stream with your string.
istringstream is(str);
int i;
// use is like an input stream
is >> i;
Ответ 5
Некоторые удобные быстрые функции (если вы не используете Boost):
template<typename T>
std::string ToString(const T& v)
{
std::ostringstream ss;
ss << v;
return ss.str();
}
template<typename T>
T FromString(const std::string& str)
{
std::istringstream ss(str);
T ret;
ss >> ret;
return ret;
}
Пример:
int i = FromString<int>(s);
std::string str = ToString(i);
Работает для любых потоковых типов (поплавков и т.д.). Вам нужно #include <sstream>
и, возможно, также #include <string>
.