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

C++StringInteger

C++ Problem Overview


I want to convert a string to an int and I don't mean ASCII codes.

For a quick run-down, we are passed in an equation as a string. We are to break it down, format it correctly and solve the linear equations. Now, in saying that, I'm not able to convert a string to an int.

I know that the string will be in either the format (-5) or (25) etc. so it's definitely an int. But how do we extract that from a string?

One way I was thinking is running a for/while loop through the string, check for a digit, extract all the digits after that and then look to see if there was a leading '-', if there is, multiply the int by -1.

It seems a bit over complicated for such a small problem though. Any ideas?

C++ Solutions


Solution 1 - C++

In C++11 there are some nice new convert functions from std::string to a number type.

So instead of

atoi( str.c_str() )

you can use

std::stoi( str )

where str is your number as std::string.

There are version for all flavours of numbers: long stol(string), float stof(string), double stod(string),... see http://en.cppreference.com/w/cpp/string/basic_string/stol

Solution 2 - C++

The possible options are described below:

1. sscanf()

    #include <cstdio>
    #include <string>

    	int i;
    	float f;
        double d;
        std::string str;

    	// string -> integer
        if(sscanf(str.c_str(), "%d", &i) != 1)
        	// error management

    	// string -> float
        if(sscanf(str.c_str(), "%f", &f) != 1)
    		// error management
	
    	// string -> double	
        if(sscanf(str.c_str(), "%lf", &d) != 1)
        	// error management

This is an error (also shown by cppcheck) because "scanf without field width limits can crash with huge input data on some versions of libc" (see here, and here).

2. std::sto()*

    #include <iostream>
    #include <string>

    	int i;
    	float f;
    	double d;
    	std::string str;

    	try {
    		// string -> integer
    		int i = std::stoi(str);

    		// string -> float
    		float f = std::stof(str);

    		// string -> double	
    		double d = std::stod(str);
    	} catch (...) {
    		// error management
    	}	

This solution is short and elegant, but it is available only on on C++11 compliant compilers.

3. sstreams

    #include <string>
    #include <sstream>

    	int i;
    	float f;
    	double d;
    	std::string str;

    	// string -> integer
    	std::istringstream ( str ) >> i;

    	// string -> float
    	std::istringstream ( str ) >> f;

    	// string -> double	
    	std::istringstream ( str ) >> d;

    	// error management ??

However, with this solution is hard to distinguish between bad input (see here).

4. Boost's lexical_cast

    #include <boost/lexical_cast.hpp>
    #include <string>

    	std::string str;

    	try {
    		int i = boost::lexical_cast<int>( str.c_str());
    		float f = boost::lexical_cast<int>( str.c_str());
    		double d = boost::lexical_cast<int>( str.c_str());
    		} catch( boost::bad_lexical_cast const& ) {
    			// Error management
    	}

However, this is just a wrapper of sstream, and the documentation suggests to use sstream for better error management (see here).

5. strto()*

This solution is very long, due to error management, and it is described here. Since no function returns a plain int, a conversion is needed in case of integer (see here for how this conversion can be achieved).

6. Qt

    #include <QString>
    #include <string>

    	bool ok;
    	std::string;

    	int i = QString::fromStdString(str).toInt(&ok);
    	if (!ok)
    		// Error management
	
    	float f = QString::fromStdString(str).toFloat(&ok);
    	if (!ok)
    		// Error management	

    	double d = QString::fromStdString(str).toDouble(&ok);
    	if (!ok)
	// Error management		
    

Conclusions

Summing up, the best solution is C++11 std::stoi() or, as a second option, the use of Qt libraries. All other solutions are discouraged or buggy.

Solution 3 - C++

std::istringstream ss(thestring);
ss >> thevalue;

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

Solution 4 - C++

use the atoi function to convert the string to an integer:

string a = "25";

int b = atoi(a.c_str());

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Solution 5 - C++

To be more exhaustive (and as it has been requested in comments), I add the solution given by C++17 using std::from_chars.

std::string str = "10";
int number;
std::from_chars(str.data(), str.data()+str.size(), number);

If you want to check whether the conversion was successful:

std::string str = "10";
int number;
auto [ptr, ec] = std::from_chars(str.data(), str.data()+str.size(), number);
assert(ec == std::errc{});
// ptr points to chars after read number

Moreover, to compare the performance of all these solutions, see the following quick-bench link: https://quick-bench.com/q/GBzK53Gc-YSWpEA9XskSZLU963Y

(std::from_chars is the fastest and std::istringstream is the slowest)

Solution 6 - C++

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";
 }

Solution 7 - C++

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);
        }
    }
    ...
}

Solution 8 - C++

Admittedly, my solution wouldn't work for negative integers, but it will extract all positive integers from input text containing integers. It makes use of numeric_only locale:

int main() {
        int num;
        std::cin.imbue(std::locale(std::locale(), new numeric_only()));
        while ( std::cin >> num)
             std::cout << num << std::endl;
        return 0;
}

Input text:

 the format (-5) or (25) etc... some text.. and then.. 7987...78hjh.hhjg9878

Output integers:

 5
25
7987
78
9878

The class numeric_only is defined as:

struct numeric_only: std::ctype<char> 
{
    numeric_only(): std::ctype<char>(get_table()) {}
 
    static std::ctype_base::mask const* get_table()
    {
        static std::vector<std::ctype_base::mask> 
            rc(std::ctype<char>::table_size,std::ctype_base::space);
 
        std::fill(&rc['0'], &rc[':'], std::ctype_base::digit);
        return &rc[0];
    }
};

Complete online demo : http://ideone.com/dRWSj

Solution 9 - C++

It's probably a bit of overkill, but boost::lexical_cast<int>( theString ) should to the job quite well.

Solution 10 - C++

Well, lot of answers, lot of possibilities. What I am missing here is some universal method that converts a string to different C++ integral types (short, int, long, bool, ...). I came up with following solution:

#include<sstream>
#include<exception>
#include<string>
#include<type_traits>

using namespace std;

template<typename T>
T toIntegralType(const string &str) {
	static_assert(is_integral<T>::value, "Integral type required.");
	T ret;
	stringstream ss(str);
	ss >> ret;
	if ( to_string(ret) != str)
        throw invalid_argument("Can't convert " + str);
	return ret;
}

Here are examples of usage:

string str = "123";
int x = toIntegralType<int>(str); // x = 123

str = "123a";
x = toIntegralType<int>(str); // throws exception, because "123a" is not int

str = "1";
bool y = toIntegralType<bool>(str); // y is true
str = "0";
y = toIntegralType<bool>(str); // y is false
str = "00";
y = toIntegralType<bool>(str); // throws exception

Why not just use stringstream output operator to convert a string into an integral type? Here is the answer: Let's say a string contains a value that exceeds the limit for intended integral type. For examle, on Wndows 64 max int is 2147483647. Let's assign to a string a value max int + 1: string str = "2147483648". Now, when converting the string to an int:

stringstream ss(str);
int x;
ss >> x;

x becomes 2147483647, what is definitely an error: string "2147483648" was not supposed to be converted to the int 2147483647. The provided function toIntegralType spots such errors and throws exception.

Solution 11 - C++

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.

Solution 12 - C++

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);

Solution 13 - C++

You can use std::stringstream, here's an example:

#include <iostream>
#include <sstream>
using namespace std;
string r;
int main() {
    cin >> r;
    stringstream tmp(r);
    int s;
    tmp >> s;
    cout << s;
    return 0;
}

Solution 14 - C++

In C++11 we can use "stoi" function to convert string into a int

#include <iostream>
#include <string>
using namespace std;
 
int main()
{
    string s1 = "16";
    string s2 = "9.49";
    string s3 = "1226";
 
    int num1 = stoi(s1);
    int num2 = stoi(s2);
    int num3 = stoi(s3);
 
    cout << "stoi(\"" << s1 << "\") is " << num1 << '\n';
    cout << "stoi(\"" << s2 << "\") is " << num2 << '\n';
    cout << "stoi(\"" << s3 << "\") is " << num3 << '\n';
 
    return 0;
}

Solution 15 - C++

atoi is a built-in function that converts a string to an integer, assuming that the string begins with an integer representation.

http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Solution 16 - C++

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

Solution 17 - C++

My Code:

#include <iostream>
using namespace std;
 
int main()
{
    string s="32";  //String
    int n=stoi(s);  //Convert to int
    cout << n + 1 << endl;
 
    return 0;
}

Solution 18 - C++

ll toll(string a){
    ll ret=0;
    bool minus=false;
    for(auto i:a){
        if(i=='-'){ minus=true; continue; }
        ret*=10;
        ret+=(i-'0');
    } if(minus) ret*=-1;
    return ret;
    # ll is defined as, #define ll long long int
    # usage: ll a = toll(string("-1234"));
}

Solution 19 - C++

To convert from string representation to integer value, we can use std::stringstream.

if the value converted is out of range for integer data type, it returns INT_MIN or INT_MAX.

Also if the string value can’t be represented as an valid int data type, then 0 is returned.

#include 
#include 
#include 

int main() {
	
	std::string x = "50";
	int y;
	std::istringstream(x) >> y;
	std::cout << y << '\n';
	return 0;
}

Output: 50

As per the above output, we can see it converted from string numbers to integer number.

Source and more at string to int c++

Solution 20 - C++

 int stringToInt(std::string value) {    
 if(value.length() == 0 ) return 0; //tu zmiana..

 if (value.find(  std::string("NULL") ) != std::string::npos) {
     return 0;
  }
 
  if (value.find(  std::string("null") ) != std::string::npos) {
     return 0;
  }
 
 
int i;
std::stringstream stream1;
stream1.clear();
stream1.str(value);
stream1 >> i;
return i;

};

Solution 21 - C++

there is another easy way : suppose you have a character like c='4' therefore you can do one of these steps :

1st : int q

q=(int) c ; (q is now 52 in ascii table ) . q=q-48; remember that adding 48 to digits is their ascii code .

the second way :

q=c-'0'; the same , character '0' means 48

Solution 22 - C++

One line version: long n = strtol(s.c_str(), NULL, base); .

(s is the string, and base is an int such as 2, 8, 10, 16.)

You can refer to this link for more details of strtol.


The core idea is to use strtol function, which is included in cstdlib.

Since strtol only handles with char array, we need to convert string to char array. You can refer to this link.

An example:

#include <iostream>
#include <string>   // string type
#include <bitset>   // bitset type used in the output

int main(){
    s = "1111000001011010";
    long t = strtol(s.c_str(), NULL, 2); // 2 is the base which parse the string

    cout << s << endl;
    cout << t << endl;
    cout << hex << t << endl;
    cout << bitset<16> (t) << endl;

    return 0;
}

which will output:

1111000001011010
61530
f05a
1111000001011010

Solution 23 - C++

I think that converting from int to std::string or vice versa needs some special functions like std::stoi() but if you need to convert a double into a string use to_string() (NOT C#. C# is .ToString() not to_string())

Solution 24 - C++

If you wot hard code :)

bool strCanBeInt(std::string string){
    for (char n : string) {
        if (n != '0' && n != '1' && n != '2' && n != '3' && n != '4' && n != '5'
            && n != '6' && n != '7' && n != '8' && n != '9') {
            return false;
        }
    }
    return true;
}

int strToInt(std::string string) {
    int integer = 0;
    int numInt;
    for (char n : string) {
        if(n == '0') numInt = 0;
        if(n == '1') numInt = 1;
        if(n == '2') numInt = 2;
        if(n == '3') numInt = 3;
        if(n == '4') numInt = 4;
        if(n == '5') numInt = 5;
        if(n == '6') numInt = 6;
        if(n == '7') numInt = 7;
        if(n == '8') numInt = 8;
        if(n == '9') numInt = 9;
        if (integer){
            integer *= 10;
        }
        integer += numInt;
    }
    return integer;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrandonView Question on Stackoverflow
Solution 1 - C++tgmathView Answer on Stackoverflow
Solution 2 - C++ClaudioView Answer on Stackoverflow
Solution 3 - C++Winston EwertView Answer on Stackoverflow
Solution 4 - C++brenjtView Answer on Stackoverflow
Solution 5 - C++Pascal H.View Answer on Stackoverflow
Solution 6 - C++user2235747View Answer on Stackoverflow
Solution 7 - C++RobᵩView Answer on Stackoverflow
Solution 8 - C++NawazView Answer on Stackoverflow
Solution 9 - C++James KanzeView Answer on Stackoverflow
Solution 10 - C++Andrushenko AlexanderView Answer on Stackoverflow
Solution 11 - C++JichaoView Answer on Stackoverflow
Solution 12 - C++Rodrigo SantosView Answer on Stackoverflow
Solution 13 - C++klgView Answer on Stackoverflow
Solution 14 - C++Manish KumawatView Answer on Stackoverflow
Solution 15 - C++EricView Answer on Stackoverflow
Solution 16 - C++user7967189View Answer on Stackoverflow
Solution 17 - C++Gonçalo GarridoView Answer on Stackoverflow
Solution 18 - C++Amey KudariView Answer on Stackoverflow
Solution 19 - C++Bala SinghView Answer on Stackoverflow
Solution 20 - C++Blazej KitaView Answer on Stackoverflow
Solution 21 - C++nooBView Answer on Stackoverflow
Solution 22 - C++HansimovView Answer on Stackoverflow
Solution 23 - C++scienclocodeView Answer on Stackoverflow
Solution 24 - C++nameView Answer on Stackoverflow