How to convert int to string in C++?
Asked Answered
M

29

2128

How can I convert from int to the equivalent string in C++? I am aware of two methods. Is there another way?

(1)

int a = 10;
char *intStr = itoa(a);
string str = string(intStr);

(2)

int a = 10;
stringstream ss;
ss << a;
string str = ss.str();
Mcardle answered 8/4, 2011 at 4:19 Comment(6)
How does option 1 even work for you at all? It's my understanding that itoa() takes three parameters.Maladapted
itoa will be faster than the stream equivalent. There are also ways of re-using the string buffer with the itoa method (avoiding heap allocations if you are frequently generating strings. e.g. for some rapidly updating numerical output). Alternatively you can generate a custom streambuf to reduce some of the allocation overhead etc. Constructing the stream in the first place is also not a low cost venture.Prewitt
@Pete: Once you start worrying about which is faster, you'll want to look at #4351871Yardley
Note that itoa() is not part of the standard and therefore using it renders your code not portable since not all compilers support it. For Linux you are most certainly out unless you are using something else than GCC, which does not support this function. If you have C++0x, go with what @Matthieu has suggested in his answer. If that's not the case, go with stringstream since it is a well supported feature and your code should be compatible with every C++ compiler out there. As an alternative you can always go with sprintf().Bruit
just a tip, for a single digit number add 48 with char explicit type cast. (char)(num+48)Portaltoportal
Just do to_string(); it's standard; otherwise, you can write a function to take each last digit and insert it into a string, then flip the string and return it.Sevilla
G
2796

C++11 introduces std::stoi (and variants for each numeric type) and std::to_string, the counterparts of the C atoi and itoa but expressed in term of std::string.

#include <string> 

std::string s = std::to_string(42);

is therefore the shortest way I can think of. You can even omit naming the type, using the auto keyword:

auto s = std::to_string(42);

Note: see [string.conversions] (21.5 in n3242)

Giuseppe answered 8/4, 2011 at 6:13 Comment(22)
to_string not a member of std fix: #12975841Shoddy
Or depending on your compiler, just set the right language standard: g++ -std=c++11 someFile.ccLesalesak
@Steve: it's supposed to be. It's a member of std in every compiler I know of except for one.Grovel
@Matthiew M. I am using the same which you suggest but i am getting this error : Error : No instance of overloaded function "std::to_string" matches the argument list i am using VS2010 c++Mcbryde
@Flying: VS2010 is sorely lacking in C++11 support as far as I know; however since I do not use it myself, I cannot check.Giuseppe
@Flying: under VS2010 you have to explicitly cast the converting integer to one of the following types [_Longlong, _ULonglong, long double]; i.e: string s = to_string((_ULonglong)i);Probation
NOTE: It won't work in NDK. to_string is not implemented in NDK.Scorekeeper
And check this out: zverovich.net/2013/09/07/… if you have any speed concern.Bicyclic
this converts a string to an integer, not a integer to string.Zoo
@uoɥʇʎPʎzɐɹC: I encourage you to look at the code sample more closely. 42 (a literal) is being converted into s (a std::string).Giuseppe
in my case, it gives me aa.cpp:9: error: 'to_string' is not a member of 'std' error and adding -std=c++11 option gives me cc1plus: error: unrecognized command line option "-std=c++11" error. gcc version4.4.7.Lambency
@ChanKim: Your compiler (gcc 4.4.7) is telling you that it is not suitable for C++11; as a result the std::to_string function is unavailable to you. A number of solutions below (such as using std::ostringstream) are suitable for C++03 (or C++98), though quite slower; or you can simply write the function yourself (not that hard for integrals, though beware of overflows).Giuseppe
@MatthieuM. I see. BTW, we know if it is just for printing, we can use std::cout << that'll convert integer for printing. I'd use ostringstream.str().Lambency
I use MinGW-w64 and I don't have this problem, in fact, it doesn't use C++98 only if I tell it to.Waller
@theo2003: All modern compilers will default to C++11 or later by now, so unless you are stuck with an old compiler (still happen in some work places unfortunately), then std::to_string should be available to you by default indeed.Giuseppe
Something tells me that it's not like atoi() but strtol(). Some might point out that long != int but as the man page of atoi() says (verbatim): The behavior is the same as strtol(nptr, NULL, 10); except that atoi() does not detect errors. - and that's what makes me think of it being not atoi(). Of course itoa() isn't defined in the C standard so I can't comment on that one.Eduino
std::to_string(int val) is listed in 21.5 numeric conversion in the C++11 spec and conforms to the current localeRemus
std::to_string() function forgets ( better yet: Ignores) the fact that there is an implicit base conversion available in itoa(). How can the behavior be the same is this useful aspect of the itoa() function is completely missing?Ocker
Oh how I hate auto! It's good for demonstration purposes, but please don't do that! It obfuscates the language and makes C++ significantly harder to read and understand.Stroke
@GabrielStaples: Matter of opinion. I'm in the AAA (Almost Always Auto) camp myself when it comes to variables, though I do put the "decorations" (const, &, *) for clarity. I do systematically elaborate function signatures, though, so the type is never far away. I'm used to it from using Rust, whose type inference is even better thus resulting in even less type annotations, and it just feels pretty natural to me.Giuseppe
Should have updated to C++20Chadd
@CPP_is_no_STANDARD: What is new in C++20 that an update is required? (I haven't used it yet)Giuseppe
F
235

C++20: std::format would be the idiomatic way now.


C++17:

Picking up a discussion with @v.oddou a couple of years later, C++17 has delivered a way to do the originally macro-based type-agnostic solution (preserved below) without going through macro ugliness.

// variadic template
template < typename... Args >
std::string sstr( Args &&... args )
{
    std::ostringstream sstr;
    // fold expression
    ( sstr << std::dec << ... << args );
    return sstr.str();
}

Usage:

int i = 42;
std::string s = sstr( "i is: ", i );
puts( sstr( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( sstr( "Foo is '", x, "', i is ", i ) );

C++98:

Since "converting ... to string" is a recurring problem, I always define the SSTR() macro in a central header of my C++ sources:

#include <sstream>

#define SSTR( x ) static_cast< std::ostringstream & >( \
        ( std::ostringstream() << std::dec << x ) ).str()

Usage is as easy as could be:

int i = 42;
std::string s = SSTR( "i is: " << i );
puts( SSTR( i ).c_str() );

Foo x( 42 );
throw std::runtime_error( SSTR( "Foo is '" << x << "', i is " << i ) );

The above is C++98 compatible (if you cannot use C++11 std::to_string), and does not need any third-party includes (if you cannot use Boost lexical_cast<>); both these other solutions have a better performance though.

Folia answered 8/4, 2011 at 4:23 Comment(10)
I am not very familiar with dynamic_cast but I am using clang to compile so it complains about it. If I just omit the dynamic_cast then it compiles fine; what purpose does the dynamic_cast serve in this case? We are already creating an ostringstream, so why cast it?Snipe
@Mathew: The link in my answer leads to a detailed description of each part of the construct. While we created a ostringstream, we called operator<<() on it, which returns ostream & -- for which .str() is not defined. I really wonder how clang would make this work without the cast (or why it generates an error with it). This construct is published in many places, and I've used it for over a decade on many different compilers, including MSVC, GCC, and XLC, so I am rather surprised clang balks at it.Folia
@Folia thanks for the details! The reason clang throws a compile time error is because llvm purposefully omits standard RTTI for space/time savings. There are alternatives available for clang, but I was still curious why the cast was needed. I am just guessing here, but I imagine clang is allowing me to make an implicit cast back to ostringstream and that is why I am not getting a compiler error for dropping the dynamic_cast.Snipe
The usage seems to be missing i, unlike on your wiki.Hime
Just came to the party for curiosity, and downvoted. Reason : too much votes for a solution that's un-elegant, and likely slow. 1. macro usage. I don't systematically frown on any macro, but this one is too short, and end-clients always fear repetition of the argument, on top of fear for unprotected multilines macros. (not protected by do{}while(0)) 2. dynamic_cast. it seems you only need a static_cast here, unless you want to assert that the library indeed is implemented as you hope. in which case you should use boost::polymorphic_downcast instead.Independence
3. crazy parameter interface. the usage you demonstrate violates POLA very bad. for this feature, what we expect is to pass a value not an expression.Independence
@v.oddou: You're free to critizise, of course. But 1. is invalid -- the macro is a single statement, do { } while( 0 ) would not add anything. With 2. and 3. you probably got a point -- this could be done with a static cast, and perhaps one of you template wizards out there could come up with a "nicer" interface. But as I said, this is by no means an invention of myself. Look around, this macro (macro!) is quite ubiquitous. That's a case of POLA in itself. I might toy with this a bit to make it more "streamlined".Folia
point 1 is invalid for this macro, indeed; but what I stated is a general point for all macros, I placed the concern at the point of view of the client, that means, for a reader at the usage site. Any sighting of any macro raises the 2 concerns I listed (to a reader/reviewer). I didn't know this SSTR was a semi-standard, I never encountered it. And I am glad, lol ;)Independence
@v.oddou: Look at what I found among the things C++17 brought us. :-) I hope you like the updated answer.Folia
FWIW C++20 has std::format, which is a nicer way of doing string formatting.Palladium
C
150

Current C++

Starting with C++11, there's a std::to_string function overloaded for integer types, so you can use code like:

int a = 20;
std::string s = std::to_string(a);
// or: auto s = std::to_string(a);

The standard defines these as being equivalent to doing the conversion with sprintf (using the conversion specifier that matches the supplied type of object, such as %d for int), into a buffer of sufficient size, then creating an std::string of the contents of that buffer.

Old C++

For older (pre-C++11) compilers, probably the most common easy way wraps essentially your second choice into a template that's usually named lexical_cast, such as the one in Boost, so your code looks like this:

int a = 10;
string s = lexical_cast<string>(a);

One nicety of this is that it supports other casts as well (e.g., in the opposite direction works just as well).

Also note that although Boost lexical_cast started out as just writing to a stringstream, then extracting back out of the stream, it now has a couple of additions. First of all, specializations for quite a few types have been added, so for many common types, it's substantially faster than using a stringstream. Second, it now checks the result, so (for example) if you convert from a string to an int, it can throw an exception if the string contains something that couldn't be converted to an int (e.g., 1234 would succeed, but 123abc would throw).

Cp answered 8/4, 2011 at 4:23 Comment(0)
B
123

I usually use the following method:

#include <sstream>

template <typename T>
  std::string NumberToString ( T Number )
  {
     std::ostringstream ss;
     ss << Number;
     return ss.str();
  }

It is described in details here.

Blayze answered 29/11, 2012 at 22:46 Comment(6)
@lifebalance: You do not need to clear() a newly created ostringstream object. clear() resets the error/eof flags, and there has not been any error/eof condition generated yet.Shaker
@Blayze NumberToString(23213.123) produces 23213.1 while std::to_string(23213.123) produces 23213.123000 What happens there?Benefice
I wouldn't normally write a function for three lines, but it does make it self documenting via the name. Clarity vs self documenting -- those shouldn't conflict, right?Remus
@KillzoneKid This is because std' ostream are stateful (this means that any previous state change is kept, like the number of decimal digit) while this method starts with a default state.Showmanship
@Showmanship so how to clear the state of ss(stringstream object) every time I reuse it? like in a loop I'm converting the value of some count variable to string and then appending it to a new string. here the ss append its previous value also every time i convert an integer to string.Subjunctive
Use .flags(...) to read & clear formatting flags, and .str("") to clear an existing string.Showmanship
M
60

You can use std::to_string available in C++11 as suggested by Matthieu M.:

std::string s = std::to_string(42);

Or, if performance is critical (for example, if you do lots of conversions), you can use fmt::format_int from the {fmt} library to convert an integer to std::string:

std::string s = fmt::format_int(42).str();

Or a C string:

fmt::format_int f(42);
const char* s = f.c_str();

The latter doesn't do any dynamic memory allocations and is more than 70% faster than libstdc++ implementation of std::to_string on Boost Karma benchmarks. See Converting a hundred million integers to strings per second for more details.

Disclaimer: I'm the author of the {fmt} library.

Mock answered 25/5, 2014 at 13:42 Comment(3)
I was curious about the claim of not having any dynamic memory allocation while remain threadsafe (re-entrant), so I read your code -- the c_str() returns a pointer to a buffer declared inside the fmt::FormatInt class -- so the pointer returned will be invalid at the semicolon -- see also https://mcmap.net/q/45713/-lifetime-of-temporaries-duplicateLysander
Yes, the same behavior as with std::string::c_str() (thus the naming). If you want to use it outside of the full expression construct an object FormatInt f(42); Then you can use f.c_str() without a danger of it being destroyed.Mock
I get something weird when I try to convert from int to string using std::to_string(num). If I store the result in a variable and try to Access it like stringNum[1] or stringNum[n] as n increases, I get garbage.Religieux
P
45

If you have Boost installed (which you should):

#include <boost/lexical_cast.hpp>

int num = 4;
std::string str = boost::lexical_cast<std::string>(num);
Pseudaxis answered 8/4, 2011 at 4:26 Comment(1)
Agreed on boost installation. I think that more than often one would format the string. For this purpose I prefer boost::format e.g format("%02d", number ).str()Openhanded
A
39

It would be easier using stringstreams:

#include <sstream>

int x = 42;          // The integer
string str;          // The string
ostringstream temp;  // 'temp' as in temporary
temp << x;
str = temp.str();    // str is 'temp' as string

Or make a function:

#include <sstream>

string IntToString(int a)
{
    ostringstream temp;
    temp << a;
    return temp.str();
}
Anaglyph answered 16/4, 2013 at 19:37 Comment(0)
P
19

Not that I know of, in pure C++. But a little modification of what you mentioned

string s = string(itoa(a));

should work, and it's pretty short.

Polydactyl answered 8/4, 2011 at 4:22 Comment(5)
itoa() is not a standard function!Moss
@cartoonist: Then what is it?Polydactyl
This function is not defined in ANSI-C and C++. So it's not supported by some compiler such as g++.Moss
cplusplus.com/reference/cstdlib/itoa: "Portability This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers." gcc.godbolt.org/z/MaEEf4evWNurseryman
@Moss I think it has to do with glibc, not g++. I wish they just added all these functions to glibc. Would make things easier for peopleMckissick
A
18

sprintf() is pretty good for format conversion. You can then assign the resulting C string to the C++ string as you did in 1.

Arlynearlynne answered 8/4, 2011 at 4:23 Comment(9)
Heh, yes. However, I usually rely on snprintf() and friends for anything of consequence when handling C strings.Arlynearlynne
@MatthieuM. You're uninformed. You don't need to hope, at least for sprintf variants, as they return the necessary size of a buffer.Sonyasoo
@user1095108: I am well informed, unfortunately. sprintf returns the number of characters written to the buffer (or a negative number if it failed). Note that unlike snprintf it has no idea how large said buffer is, and may overwrite past the end.Giuseppe
@MatthieuM. Your comment proves further, that you are not. If the output was truncated due to this limit then the return value is the number of characters (excluding the terminating null byte) which would have been written to the final string if enough space had been available. Thus, a return value of size or more means that the output was truncated. So you call it with a NULL and zero size to get the necessary buffer size.Sonyasoo
@user1095108: I think you are mistaking snprintf (note the SNP prefix) and sprintf (note the SP prefix). You pass the size to the former, and it takes care not to overflow, however the latter knows not the size of the buffer and thus may overflow.Giuseppe
The idea is to call a snprintf variant first and a sprintf variant after that. As the buffer size is known by then, calling sprintf becomes entirely safe.Sonyasoo
@Sonyasoo why call twice? If snprintf is called with a sufficient buffer, then there is no need for a second call unless you need to conserve the memory (and then strcpy is faster). If snprintf is not called with a sufficient buffer, a second call to either sprintf or snprintf is still not sure to work.Shewchuk
@Shewchuk Interesting idea, call first with a "guess" buffer, then a second time, if the first call fails. But otherwise, what you write here is not true. You call for the first time exactly so that you find out what size the buffer has to be. After you find out the second call must succeed, if the snprintf implementation is written correctly.Sonyasoo
@Sonyasoo Ah, yes. If the first buffer to snprintf is insufficient, the return value tells you what would be sufficient. I would still use snprintf for the second call, because relying on the implementations of sprintf and snprintf to match is unnecessarily dangerous.Shewchuk
D
15

Using stringstream for number conversion is dangerous!

See std::ostream::operator<< where it tells that operator<< inserts formatted output.

Depending on your current locale an integer greater than three digits, could convert to a string of four digits, adding an extra thousands separator.

E.g., int = 1000 could be converted to a string 1.001. This could make comparison operations not work at all.

So I would strongly recommend using the std::to_string way. It is easier and does what you expect.

From std::to_string:

C++17 provides std::to_chars as a higher-performance locale-independent alternative.

Difference answered 18/8, 2017 at 12:47 Comment(4)
I agree that this is a serious problem if you need to exchange data. Unfortunately, also std::to_string uses the current locale (see en.cppreference.com/w/cpp/string/basic_string/to_string , the 'Notes' section). Almost all standard tools (from stringstreams to sprintf, but also sscanf etc) are using the current locale. I wasn't aware of this until recently when it hit me hard. Currently using home-grown stuff, not hard to make.Icecap
In the link above it is also statet that C++17 provides std::to_chars as a higher-performance locale-independent alternative.Difference
Unfortunately, I am stuck with C++11 for the coming year(s) (quite an improvement already, luckily).Icecap
from_chars and to_chars would be perfect but unfortunately they didn't offer a wchar_t variant.Jute
M
13

First include:

#include <string>
#include <sstream>

Second add the method:

template <typename T>
string NumberToString(T pNumber)
{
 ostringstream oOStrStream;
 oOStrStream << pNumber;
 return oOStrStream.str();
}

Use the method like this:

NumberToString(69);

or

int x = 69;
string vStr = NumberToString(x) + " Hello word!."
Melisa answered 31/5, 2013 at 21:32 Comment(0)
P
13

C++ has evolved over time, and with it the methods to convert an int to a string. I will provide a summary in this answer. Note that some methods don't give you a std::string directly, but a char*. You can easily convert char* to the former, and in some cases it's beneficial to avoid std::string.

Comparison

The following table compares all options (only C++ standard options, no third-party libraries) from most recent to least recent.

Method Result Pros & Cons
std::format
std::string ✔️ universal method (for formattable types)
✔️ supports common bases, and locale
❌ slow to compile
❌ slow (forward to std::vformat)
std::to_chars
written to
char[]
✔️ fast and zero overhead (no dynamic allocations)
✔️supports ANY base as run-time argument
❌ only works for fundamental types
❌ interface is not ergonomic
std::to_string
std::string ✔️ concise and self-explanatory
✔️ zero overhead (if you need a std::string)
❌ only works for fundamental types
❌ base 10 only
std::ostringstream
std::string ✔️ universal method (for types with << operator)
✔️ considers locale (e.g. can change base)
❌ slow, and high overhead of streams
std::sprintf
written to
char[]
✔️ smallest assembly output
✔️ supports some bases
✔️ compatible with C, unlike all other methods
❌ only works for fundamental types
❌ interface is not ergonomic
❌ no type safety

Recommended Practice

Use std::to_string if you just need to turn an int into a decimal string. It's simple, elegant, and correct.

If you can't use std::to_string, choose another option based on the features you need. Prefer more modern solutions like std::to_chars over older solutions like std::sprintf.

Examples

std::format
std::string d = std::format("{}", 100);   // d = "100"
std::string h = std::format("{:#x}", 15); // h = "0xf"
std::to_chars
std::array<char, 5> a;
auto [ptr, ec] = std::to_chars(a.data(), a.data() + a.size(), 1234);
// a = {'1', '2', '3', '4', indeterminate} (no null terminator!)
// ptr points to 4, and ec == std::errc{}
// notice that there is no null terminator
std::string_view view(a.data(), ptr); // string_view doesn't require null terminators
std::string s(a.data(), ptr); // wrapping in a std:string kinda defeats the point
std::to_string
std::string d = std::to_string(100); // d = "100"
std::ostringstream
std::string d = (std::ostringstream() << 100).str();            // d = "100"
std::string h = (std::ostringstream() << std::hex << 15).str(); // h = "0xf"

Note: these one-liners rely on LWG 1203 (C++20), but recent compilers allow it in C++11 mode too. Update your compiler, or create a separate std::ostringstream stream variable if it doesn't work.

sprintf / snprintf
char a[20];
sprintf(a, "%d", 15);                // a = {'1', '5', '\0', ?, ?, ?, ...}
snprintf(a, sizeof(a), "%#x", 15);   // a = {'0', 'x', 'f', '\0', ?, ?, ...}
std::string s = a;
Punak answered 10/9, 2023 at 8:3 Comment(2)
This answer is great! However, the one-line solution for std::ostringstream does not work for me. g++ 4.8.5 issues an error: class std::basic_ostream<char> has no member named str. Is there any way to fix that?Afro
@Afro the std::ostringstream example actually relies on LWG 1203 which was applied to C++20. However, recent compilers allow it even in C++11 mode (godbolt.org/z/Pdr1zaTnf). GCC 4 is really old, so either you could upgrade your compiler, or you could make it work by not using the one-liner but creating a separate std::ostringstream variable.Punak
A
10

In C++11 we can use the "to_string()" function to convert an int into a string:

#include <iostream>
#include <string>

int main() {
    int x = 1612;
    std::string s = std::to_string(x);
    std::cout << s << std::endl;

    return 0;
}
Audrit answered 19/2, 2022 at 19:8 Comment(1)
Don't teach people to use using namespace std;Concord
P
9

C++17 provides std::to_chars as a higher-performance locale-independent alternative.

Peculate answered 4/1, 2019 at 11:21 Comment(1)
For performance intensive applications you need this one and not the stringstream route.Jute
S
6

If you need fast conversion of an integer with a fixed number of digits to char* left-padded with '0', this is the example for little-endian architectures (all x86, x86_64 and others):

If you are converting a two-digit number:

int32_t s = 0x3030 | (n/10) | (n%10) << 8;

If you are converting a three-digit number:

int32_t s = 0x303030 | (n/100) | (n/10%10) << 8 | (n%10) << 16;

If you are converting a four-digit number:

int64_t s = 0x30303030 | (n/1000) | (n/100%10)<<8 | (n/10%10)<<16 | (n%10)<<24;

And so on up to seven-digit numbers. In this example n is a given integer. After conversion it's string representation can be accessed as (char*)&s:

std::cout << (char*)&s << std::endl;

Note: If you need it on big-endian byte order, though I did not tested it, but here is an example: for three-digit number it is int32_t s = 0x00303030 | (n/100)<< 24 | (n/10%10)<<16 | (n%10)<<8; for four-digit numbers (64 bit arch): int64_t s = 0x0000000030303030 | (n/1000)<<56 | (n/100%10)<<48 | (n/10%10)<<40 | (n%10)<<32; I think it should work.

Salesmanship answered 25/11, 2016 at 7:36 Comment(0)
C
3

It's rather easy to add some syntactical sugar that allows one to compose strings on the fly in a stream-like way

#include <string>
#include <sstream>

struct strmake {
    std::stringstream s;
    template <typename T> strmake& operator << (const T& x) {
        s << x; return *this;
    }   
    operator std::string() {return s.str();}
};

Now you may append whatever you want (provided that an operator << (std::ostream& ..) is defined for it) to strmake() and use it in place of an std::string.

Example:

#include <iostream>

int main() {
    std::string x =
      strmake() << "Current time is " << 5+5 << ":" << 5*5 << " GST";
    std::cout << x << std::endl;
}
Carbonyl answered 3/2, 2018 at 9:17 Comment(0)
T
2
int i = 255;
std::string s = std::to_string(i);

In C++, to_string() will create a string object of the integer value by representing the value as a sequence of characters.

Toadstool answered 17/6, 2020 at 15:15 Comment(1)
While this code may resolve the OP's issue, it is best to include an explanation as to how your code addresses the OP's issue. In this way, future visitors can learn from your post, and apply it to their own code. SO is not a coding service, but a resource for knowledge. Also, high quality, complete answers are more likely to be upvoted. These features, along with the requirement that all posts are self-contained, are some of the strengths of SO as a platform, that differentiates it from forums. You can edit to add additional info &/or to supplement your explanations with source documentation.Forworn
F
1

Use:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}
Floe answered 14/4, 2016 at 9:10 Comment(3)
Works only with literal numbers, doesn't evaluate variable content, though useful sometimes.Terpsichorean
Right. But definitely handy at timeFloe
Only works at compile time with literal constants numbers, i think the OP asks for a dynamic conversion, using variable integersMord
R
0

I use:

int myint = 0;
long double myLD = 0.0;

string myint_str = static_cast<ostringstream*>(&(ostringstream() << myint))->str();
string myLD_str = static_cast<ostringstream*>(&(ostringstream() << myLD))->str();

It works on my Windows and Linux g++ compilers.

Ricci answered 18/1, 2014 at 19:59 Comment(0)
C
0

If you're using the Microsoft Foundation Class library, you can use CString:

int a = 10;
CString strA;
strA.Format("%d", a);
Cullum answered 5/2, 2014 at 16:25 Comment(0)
D
0

C++11 introduced std::to_string() for numeric types:

int n = 123; // Input, signed/unsigned short/int/long/long long/float/double
std::string str = std::to_string(n); // Output, std::string
Doll answered 26/7, 2018 at 13:46 Comment(1)
Hi! Could you add an explanation on why and how this provides an answer to the question?Spondee
Z
-1

Here's another easy way to do it:

char str[100];
sprintf(str, "%d", 101);
string s = str;

sprintf is a well-known one to insert any data into a string of the required format.

You can convert a char * array to a string as shown in the third line.

Zoan answered 7/2, 2018 at 16:10 Comment(0)
M
-2
string number_to_string(int x) {

    if (!x)
        return "0";

    string s, s2;
    while(x) {
        s.push_back(x%10 + '0');
        x /= 10;
    }
    reverse(s.begin(), s.end());
    return s;
}
Metempsychosis answered 16/12, 2015 at 21:10 Comment(3)
Thank you for this code snippet, which might provide some limited short-term help. A proper explanation would greatly improve its long-term value by showing why this is a good solution to the problem, and would make it more useful to future readers with other, similar questions. Please edit your answer to add some explanation, including the assumptions you've made.Adversaria
Completely fails for n≤0Adversaria
Add comments, explain your answer, read how to answer.Key
D
-2

All you have to do is use String when defining your variable (String intStr). Whenever you need that variable, call whateverFunction(intStr.toInt())

Dandelion answered 26/7, 2022 at 21:14 Comment(2)
Can you provide a reference to toInt()? Where is "String" (uppercase "s") defined? Part of some vendor-specfic library? Are you sure it is C++? It is in the Arduino environment, but that may not count. It doesn't appear to be part of the standard string class.Antidote
What did you test it on? Compiler, incl. version. Environment (operating system, IDE, etc.)? C++ version?Antidote
E
-3
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs, "%d", timeStart.elapsed()/1000);
sprintf(bufMs, "%d", timeStart.elapsed()%1000);
Elliot answered 6/2, 2013 at 13:40 Comment(2)
leaks memory, -1 from meConveyor
This smells like buffer overrun.Pullover
P
-3
namespace std
{
    inline string to_string(int _Val)
    {   // Convert long long to string
        char _Buf[2 * _MAX_INT_DIG];
        snprintf(_Buf, "%d", _Val);
        return (string(_Buf));
    }
}

You can now use to_string(5).

Psilocybin answered 21/2, 2013 at 10:18 Comment(2)
While this solution works, it is highly discouraged! Names starting with underscore and a capital letter are reserved for the compiler, you shouldn't ever use them. Injecting functions into the std namespace is not something you should ever do, either. Also, it doesn't seem like _MAX_INT_DIG is a standard macro, so if it is defined wrongly, this code has the great potential of inducing undefined behaviour. -1Kidd
What is _MAX_INT_DIG and why is it doubled?Conveyor
C
-3

You use a counter type of algorithm to convert to a string. I got this technique from programming Commodore 64 computers. It is also good for game programming.

  • You take the integer and take each digit that is weighted by powers of 10. So assume the integer is 950.

    • If the integer equals or is greater than 100,000 then subtract 100,000 and increase the counter in the string at ["000000"];
      keep doing it until no more numbers in position 100,000. Drop another power of ten.

    • If the integer equals or is greater than 10,000 then subtract 10,000 and increase the counter in the string at ["000000"] + 1 position;
      keep doing it until no more numbers in position 10,000.

  • Drop another power of ten

  • Repeat the pattern

I know 950 is too small to use as an example, but I hope you get the idea.

Counterfactual answered 9/10, 2016 at 19:18 Comment(1)
It's not very helpful to describe an algorithm, rather than show an example in code.Kellner
W
-3

This worked for me -

My code:

#include <iostream>
using namespace std;

int main()
{
    int n = 32;
    string s = to_string(n);
    cout << "string: " + s  << endl;
    return 0;
}
Wiener answered 14/5, 2019 at 11:12 Comment(0)
W
-4

I think using stringstream is pretty easy:

 string toString(int n)
 {
     stringstream ss(n);
     ss << n;
     return ss.str();
 }

 int main()
 {
    int n;
    cin >> n;
    cout << toString(n) << endl;
    return 0;
 }
Westney answered 17/9, 2018 at 13:37 Comment(1)
This was mentioned in the question, and unfortunately is quite slow.Pullover

© 2022 - 2024 — McMap. All rights reserved.