c ++从stringparsingint
可能重复:
如何parsing一个string在C + +中的int?
我已经做了一些研究,有人说使用atio,其他人说这是坏的,反正我也无法工作。
所以我只想问问问题,将string转换为int的正确方法是什么。
string s = "10"; int i = s....?
谢谢!
-
在C ++ 11中,使用
std::stoi
作为:std::string s = "10"; int i = std::stoi(s);
请注意,如果转换无法执行,
std::stoi
将抛出std::invalid_argument
types的exception,如果转换导致溢出(即当string值对于int
types太大)时,std::stoi
将抛出exception。 你可以使用std::stol
或者std:stoll
,以防int
对于inputstring来说太小了。 -
在C ++ 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
请注意,上述两种方法将inputs = "10jh"
失败。 他们将返回10而不是通知错误。 因此,安全可靠的方法是编写自己的函数来parsinginputstring,并validation每个字符是否为数字,然后相应地工作。 下面是一个强大的实施(虽然未经testing):
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! }
这个解决scheme是我的另一个解决scheme稍微修改版本
你可以使用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; }
没有“正确的方式”。 如果你想要一个通用的(但不是最佳的)解决scheme,你可以使用boost :: lexical强制转换。
C ++的通用解决scheme是使用std :: ostream和<<运算符。 您可以使用stringstream和stringstream :: str()方法转换为string。
如果你真的需要一个快速机制(记住20/80规则),你可以寻找一个“专用”的解决scheme,如http://www.partow.net/programming/strtk/index.html
最好的祝福,
马尔钦
你可以使用istringstream 。
string s = "10"; // create an input stream with your string. istringstream is(str); int i; // use is like an input stream is >> i;
一些方便的快速function(如果你不使用升压):
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);
适用于任何streamedtypes(浮游物等)。 你需要#include <sstream>
,也可能包含#include <string>
。