2096

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();
peterh
  • 11,875
  • 18
  • 85
  • 108
Nemo
  • 24,540
  • 12
  • 45
  • 61
  • 6
    I think both methods you gave are good solutions. it depends on the context where you need to do it. If you're already working with streams, for example reading or writing a file, then your second method is the best. If you need to pass an int as a string to a function argument, then itoa could be an easy way. But most of the time, int to string conversion occurs when dealing with files, so streams are appropriate. – Charles Brunet Apr 08 '11 at 05:21
  • 63
    How does option 1 even work for you at all? It's my understanding that `itoa()` takes three parameters. – arkon Apr 10 '13 at 02:49
  • 3
    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. – Pete Aug 28 '13 at 18:46
  • 7
    @Pete: Once you start worrying about which is faster, you'll want to look at http://stackoverflow.com/questions/4351371/c-performance-challenge-integer-to-stdstring-conversion – Ben Voigt Sep 24 '13 at 19:21
  • 25
    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(). – rbaleksandar Jun 16 '14 at 09:59
  • just a tip, for a single digit number add 48 with char explicit type cast. `(char)(num+48)` – tayyab May 04 '20 at 22:13
  • 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. – Hudson Jan 08 '23 at 01:10

31 Answers31

2748

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)

the_storyteller
  • 2,335
  • 1
  • 26
  • 37
Matthieu M.
  • 287,565
  • 48
  • 449
  • 722
  • 219
    `to_string` not a member of `std` fix: http://stackoverflow.com/questions/12975341/to-string-is-not-a-member-of-std-says-so-g – Ben Nov 02 '12 at 03:02
  • 43
    Or depending on your compiler, just set the right language standard: `g++ -std=c++11 someFile.cc` – Thomas M. DuBuisson Nov 29 '12 at 23:12
  • 15
    @Steve: it's supposed to be. It's a member of `std` in every compiler I know of except for one. – Mooing Duck May 31 '13 at 21:34
  • 6
    @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++ –  Sep 26 '13 at 13:51
  • 1
    @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. – Matthieu M. Sep 26 '13 at 14:31
  • 24
    @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);` – Zac Dec 06 '13 at 14:50
  • 2
    NOTE: It won't work in NDK. to_string is not implemented in NDK. – Ming Aug 12 '14 at 05:42
  • And check this out: http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html if you have any speed concern. – Hosi Apr 12 '15 at 05:28
  • 1
    this converts a string to an integer, not a integer to string. – noɥʇʎԀʎzɐɹƆ Aug 08 '16 at 18:32
  • 3
    @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`). – Matthieu M. Aug 09 '16 at 01:57
  • 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. – Chan Kim Aug 16 '16 at 07:59
  • 1
    @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). – Matthieu M. Aug 16 '16 at 14:38
  • @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(). – Chan Kim Aug 16 '16 at 14:49
  • 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. –  Jan 11 '17 at 08:07
  • 1
    @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. – Matthieu M. Jan 11 '17 at 08:09
  • 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. – Pryftan Apr 04 '18 at 02:05
  • std::to_string(int val) is listed in 21.5 numeric conversion in the C++11 spec and conforms to the current locale – phorgan1 Nov 23 '18 at 02:02
  • 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? – lcollado Jan 13 '22 at 00:12
  • 1
    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. – Gabriel Staples Jan 28 '22 at 16:47
  • 2
    @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. – Matthieu M. Jan 29 '22 at 10:17
  • Should have updated to C++20 – CPP_is_no_STANDARD Jun 25 '22 at 06:27
  • @CPP_is_no_STANDARD: What is new in C++20 that an update is required? (I haven't used it yet) – Matthieu M. Jun 25 '22 at 10:59
232

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
DevSolar
  • 67,862
  • 21
  • 134
  • 209
  • 2
    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? – Mathew Oct 21 '14 at 02:38
  • 2
    @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. – DevSolar Oct 21 '14 at 06:59
  • @DevSolar 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. – Mathew Oct 21 '14 at 14:55
  • The usage seems to be missing `i`, unlike on your wiki. – chappjc Jan 23 '15 at 22:16
  • 9
    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. – v.oddou Jun 18 '15 at 03:30
  • 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. – v.oddou Jun 18 '15 at 03:36
  • 2
    @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". – DevSolar Jun 18 '15 at 08:45
  • 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 ;) – v.oddou Jun 18 '15 at 09:01
  • 1
    @v.oddou: Look at what I found among the things C++17 brought us. :-) I hope you like the updated answer. – DevSolar May 13 '18 at 20:57
  • FWIW C++20 has `std::format`, which is a nicer way of doing string formatting. – Aykhan Hagverdili Feb 13 '21 at 18:55
144

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

Jerry Coffin
  • 476,176
  • 80
  • 629
  • 1,111
122

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Rasoul
  • 3,758
  • 5
  • 26
  • 34
  • 26
    @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. – Remy Lebeau Aug 05 '15 at 04:00
  • 2
    @Rasoul `NumberToString(23213.123)` produces `23213.1` while `std::to_string(23213.123)` produces `23213.123000` What happens there? – Killzone Kid Nov 05 '17 at 23:00
  • 1
    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? – phorgan1 Nov 23 '18 at 02:04
  • 1
    @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. – xryl669 Jun 14 '19 at 14:04
  • @xryl669 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. – y_159 Dec 21 '19 at 12:20
  • 1
    Use `.flags(...)` to read & clear formatting flags, and `.str("")` to clear an existing string. – xryl669 Dec 21 '19 at 22:46
58

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.

vitaut
  • 49,672
  • 25
  • 199
  • 336
  • 2
    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 http://stackoverflow.com/questions/4214153/lifetime-of-temporaries – Soren Jun 16 '14 at 22:17
  • 1
    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. – vitaut Jun 16 '14 at 23:40
  • 1
    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. – user8951490 Feb 09 '18 at 07:25
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);
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Kevin
  • 1,889
  • 14
  • 11
  • 5
    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() – Werner Erasmus Aug 28 '13 at 18:47
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();
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
user2287915
  • 431
  • 4
  • 3
20

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.

user541686
  • 205,094
  • 128
  • 528
  • 886
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.

bluish
  • 26,356
  • 27
  • 122
  • 180
Throwback1986
  • 5,887
  • 1
  • 30
  • 22
  • 2
    Heh, yes. However, I usually rely on snprintf() and friends for anything of consequence when handling C strings. – Throwback1986 Apr 08 '11 at 12:42
  • @MatthieuM. You're uninformed. You don't need to hope, at least for `sprintf` variants, as they return the necessary size of a buffer. – user1095108 Sep 25 '13 at 07:07
  • @user1095108: I am well informed, unfortunately. [sprintf](http://en.cppreference.com/w/cpp/io/c/fprintf) 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. – Matthieu M. Sep 25 '13 at 07:46
  • 1
    @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. – user1095108 Sep 25 '13 at 08:02
  • 2
    @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. – Matthieu M. Sep 25 '13 at 09:37
  • 1
    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. – user1095108 Sep 25 '13 at 09:40
  • @user1095108 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. – mabraham Oct 02 '13 at 14:24
  • @mabraham 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. – user1095108 Oct 02 '13 at 20:52
  • 1
    @user1095108 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. – mabraham Oct 05 '13 at 08:02
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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
YesThatIsMyName
  • 1,585
  • 3
  • 23
  • 30
  • 2
    I agree that this is a serious problem if you need to exchange data. Unfortunately, also `std::to_string` uses the current locale (see http://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. – Bert Bril Oct 24 '17 at 22:05
  • In the link above it is also statet that C++17 provides std::to_chars as a higher-performance locale-independent alternative. – YesThatIsMyName Jan 10 '18 at 12:01
  • Unfortunately, I am stuck with C++11 for the coming year(s) (quite an improvement already, luckily). – Bert Bril Jan 12 '18 at 21:39
  • 1
    from_chars and to_chars would be perfect but unfortunately they didn't offer a wchar_t variant. – gast128 Oct 10 '19 at 10:37
14

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!."
quamrana
  • 37,849
  • 12
  • 53
  • 71
Alex
  • 265
  • 3
  • 6
12

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

#include <iostream>
#include <string>
using namespace std;

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

    return 0;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Manish Kumawat
  • 249
  • 4
  • 5
9

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

Waqar
  • 8,558
  • 4
  • 35
  • 43
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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Alek
  • 634
  • 7
  • 7
4

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;
}
AndreyS Scherbakov
  • 2,674
  • 2
  • 20
  • 27
3
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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Archie
  • 153
  • 9
  • 2
    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. – ysf Jun 17 '20 at 18:46
2

Use:

#define convertToString(x) #x

int main()
{
    convertToString(42); // Returns const char* equivalent of 42
}
isanae
  • 3,253
  • 1
  • 22
  • 47
maverick9888
  • 498
  • 6
  • 16
1

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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
J_C
  • 137
  • 1
  • 3
1

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

int a = 10;
CString strA;
strA.Format("%d", a);
TylerH
  • 20,799
  • 66
  • 75
  • 101
Tur1ng
  • 745
  • 8
  • 22
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.

TylerH
  • 20,799
  • 66
  • 75
  • 101
Natesh bhat
  • 12,274
  • 10
  • 84
  • 125
1

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
Kotauskas
  • 1,239
  • 11
  • 31
0

Use:

#include<iostream>
#include<string>

std::string intToString(int num);

int main()
{
    int integer = 4782151;

    std::string integerAsStr = intToString(integer);

    std::cout << "integer = " << integer << std::endl;
    std::cout << "integerAsStr = " << integerAsStr << std::endl;

    return 0;
}

std::string intToString(int num)
{
    std::string numAsStr;
    bool isNegative = num < 0;
    if(isNegative) num*=-1;

    do
    {
       char toInsert = (num % 10) + 48;
       numAsStr.insert(0, 1, toInsert);

       num /= 10;
    }while (num);
  
    return isNegative? numAsStr.insert(0, 1, '-') : numAsStr;
}
Tayyab Mazhar
  • 1,560
  • 10
  • 26
0

Using the plain standard stdio header, you can cast the integer over sprintf into a buffer, like so:

#include <stdio.h>

int main()
{
    int x = 23;
    char y[2]; // The output buffer
    sprintf(y, "%d", x);
    printf("%s", y)
}

Remember to take care of your buffer size according to your needs (the string output size).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
PYK
  • 3,674
  • 29
  • 17
  • While I like your answer, it is incorrect: you forgot the null-character to mark the ending of the converted string (i.e., the size of the output string must be, at least, 3 in this case). See https://www.gnu.org/software/libc/manual/html_node/Formatted-Output-Functions.html – SRG Aug 04 '21 at 10:21
0

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

merpcode
  • 11
  • 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](https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/toint/), but that may not count. It doesn't appear to be part of the [standard string class](https://cplusplus.com/reference/string/string/). – Peter Mortensen Oct 05 '22 at 21:59
  • What did you test it on? Compiler, incl. version. Environment (operating system, IDE, etc.)? C++ version? – Peter Mortensen Oct 30 '22 at 14:56
0

use my function "inToString"

it accepts one integer argument called "number"

remember you can change the argument type to FLOAT or DOUBLE instead of INT like:

"inToString(float number)" or "inToString(double number)"

and it will work fine but make sure to give it the same type ^_^

#include<iostream>
#include<sstream>

using namespace std;


string inToString(int number){

     stringstream stream;

     stream << number;
    
     string outString;
    
     stream >> outString;

     return  outString;

 }

 int main(){

     int number = 100;

     string stringOut = inToString(number);

     cout << "stringOut : " + stringOut << endl;

     return 0;

 }
Kamal Zaitar
  • 101
  • 1
  • 3
-1
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;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • 2
    Thank you for this code snippet, which might provide some limited short-term help. A proper explanation [would greatly improve](//meta.stackexchange.com/q/114762) 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. – Toby Speight Dec 03 '19 at 09:12
  • 1
    Completely fails for n≤0 – Toby Speight Dec 03 '19 at 09:18
  • 2
    Add comments, explain your answer, read [how to answer](https://stackoverflow.com/help/how-to-answer). – Aksen P Dec 03 '19 at 09:29
-1

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;
}
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Gonçalo Garrido
  • 126
  • 2
  • 11
-2

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;
 }
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
rashedcs
  • 3,588
  • 2
  • 39
  • 40
-3
char * bufSecs = new char[32];
char * bufMs = new char[32];
sprintf(bufSecs, "%d", timeStart.elapsed()/1000);
sprintf(bufMs, "%d", timeStart.elapsed()%1000);
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
-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).

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • 11
    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. -1 – iFreilicht Nov 19 '14 at 14:57
  • 7
    What is _MAX_INT_DIG and why is it doubled? – paulm Mar 25 '15 at 16:27
-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.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
AdmiralSmith
  • 105
  • 2