c ++从字符串解析int

时间:2010-12-14 18:18:28

标签: c++ string int

  

可能重复:
  How to parse a string to an int in C++?

我做了一些研究,有些人说使用atio而其他人说它很糟糕,我无论如何也无法让它工作。

所以我只想问一下,将字符串转换为int的正确方法是什么。

string s = "10";
int i = s....?

谢谢!

5 个答案:

答案 0 :(得分:84)

  • 在C ++ 11中,使用std::stoi

    std::string s = "10";
    int i = std::stoi(s);
    

    请注意,如果转换无法执行,std::stoi将抛出std::invalid_argument类型的异常;如果转换导致溢出,则std::out_of_range会抛出int(即字符串值对于{ {1}}类型)。您可以使用std::stolstd:stoll,但如果int对于输入字符串来说似乎太小。

  • 在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
    

请注意,输入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!
} 

此解决方案是my another solution的略微修改版本。

答案 1 :(得分:13)

您可以使用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;
}

答案 2 :(得分:9)

没有“正确的方法”。如果你想要一个通用的(但不是最理想的)解决方案,你可以使用boost :: lexical cast。

C ++的常见解决方案是使用std :: ostream和&lt;&lt;运营商。您可以使用stringstream和stringstream :: str()方法转换为字符串。

如果你真的需要快速机制(请记住20/80规则),你可以寻找像http://www.partow.net/programming/strtk/index.html这样的“专用”解决方案

最诚挚的问候,
马尔钦

答案 3 :(得分:7)

您可以使用istringstream

string s = "10";

// create an input stream with your string.
istringstream is(str);

int i;
// use is like an input stream
is >> i;

答案 4 :(得分:4)

一些方便的快速功能(如果你没有使用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>