How can I convert a std::string to int?

后端 未结 19 1069
梦毁少年i
梦毁少年i 2020-11-22 02:10

Just have a quick question. I\'ve looked around the internet quite a bit and I\'ve found a few solutions but none of them have worked yet. Looking at converting a string to

相关标签:
19条回答
  • 2020-11-22 03:06

    1. std::stoi

    std::string str = "10";  
    int number = std::stoi(str); 
    

    2. string streams

    std::string str = "10";  
    int number;  
    std::istringstream(str) >> number
    

    3. boost::lexical_cast

    #include <boost/lexical_cast.hpp>
    std::string str = "10";  
    int number;
        
    try 
    {
        number = boost::lexical_cast<int>(str);
        std::cout << number << std::endl;
    }
    catch (boost::bad_lexical_cast const &e) // bad input
    {
        std::cout << "error" << std::endl;
    }
    

    4. std::atoi

    std::string str = "10";
    int number = std::atoi(str.c_str()); 
    

    5. sscanf()

     std::string str = "10";
     int number;
     if (sscanf(str .c_str(), "%d", &number) == 1) 
     {
         std::cout << number << '\n';
     } 
     else 
     {
         std::cout << "Bad Input";
     }
    
    0 讨论(0)
  • 2020-11-22 03:07

    In Windows, you could use:

    const std::wstring hex = L"0x13";
    const std::wstring dec = L"19";
    
    int ret;
    if (StrToIntEx(hex.c_str(), STIF_SUPPORT_HEX, &ret)) {
        std::cout << ret << "\n";
    }
    if (StrToIntEx(dec.c_str(), STIF_SUPPORT_HEX, &ret)) {
        std::cout << ret << "\n";
    }
    

    strtol,stringstream need to specify the base if you need to interpret hexdecimal.

    0 讨论(0)
  • 2020-11-22 03:08
    std::istringstream ss(thestring);
    ss >> thevalue;
    

    To be fully correct you'll want to check the error flags.

    0 讨论(0)
  • 2020-11-22 03:09

    What about Boost.Lexical_cast?

    Here is their example:

    The following example treats command line arguments as a sequence of numeric data:

    int main(int argc, char * argv[])
    {
        using boost::lexical_cast;
        using boost::bad_lexical_cast;
    
        std::vector<short> args;
    
        while(*++argv)
        {
            try
            {
                args.push_back(lexical_cast<short>(*argv));
            }
            catch(bad_lexical_cast &)
            {
                args.push_back(0);
            }
        }
        ...
    }
    
    0 讨论(0)
  • 2020-11-22 03:09

    I know this question is really old but I think there's a better way of doing this

    #include <string>
    #include <sstream>
    
    bool string_to_int(std::string value, int * result) {
      std::stringstream stream1, stream2;
      std::string stringednumber;
      int tempnumber;
      stream1 << value;
      stream1 >> tempnumber;
      stream2 << tempnumber;
      stream2 >> stringednumber;
      if (!value.compare(stringednumber)) {
        *result = tempnumber;
        return true;
      }
      else return false;
    }
    

    If I wrote the code right, this will return a boolean value that tells you if the string was a valid number, if false, it wasn't a number, if true it was a number and that number is now result, you would call this this way:

    std::string input;
    std::cin >> input;
    bool worked = string_to_int(input, &result);
    
    0 讨论(0)
  • 2020-11-22 03:10

    From http://www.cplusplus.com/reference/string/stoi/

    // stoi example
    #include <iostream>   // std::cout
    #include <string>     // std::string, std::stoi
    
    int main ()
    {
      std::string str_dec = "2001, A Space Odyssey";
      std::string str_hex = "40c3";
      std::string str_bin = "-10010110001";
      std::string str_auto = "0x7f";
    
      std::string::size_type sz;   // alias of size_t
    
      int i_dec = std::stoi (str_dec,&sz);
      int i_hex = std::stoi (str_hex,nullptr,16);
      int i_bin = std::stoi (str_bin,nullptr,2);
      int i_auto = std::stoi (str_auto,nullptr,0);
    
      std::cout << str_dec << ": " << i_dec << " and [" << str_dec.substr(sz) << "]\n";
      std::cout << str_hex << ": " << i_hex << '\n';
      std::cout << str_bin << ": " << i_bin << '\n';
      std::cout << str_auto << ": " << i_auto << '\n';
    
      return 0;
    }
    

    Output:

    2001, A Space Odyssey: 2001 and [, A Space Odyssey]

    40c3: 16579

    -10010110001: -1201

    0x7f: 127

    0 讨论(0)
提交回复
热议问题