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_argumenttypes的exception,如果转换导致溢出(即当string值对于inttypes太大)时, 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>