Convert String to int / Convert int to String in C++

AID: 1577
  • Status: Published

10375 points

  • By
  • TypeTips/Tricks
  • Posted on2009-09-17 at 22:02:13
Awards
  • Community Pick
  • Experts Exchange Approved

This EE article provides examples of conversion techniques for various types of string variables:  classic C-style strings, MFC/ATL CStrings, and STL's std::string data type.

"" title="Convert Integer to String"]
int to C-style (NULL-terminated char[]) string

int   n=1234567890;
char  szResult[12];

#include <stdio.h>
...
sprintf(   szResult, "%d", n );               // use "%u" for unsigned int
sprintf_s( szResult, sizeof(szResult), "%d", n );  // "safe" version

//------------------------------------- alternative: itoa
#include <stdlib.h>
...
_itoa(   n, szResult, 10 );
_itoa_s( n, szResult, sizeof(szResult), 10);    // "safe" version
                                  
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:

Select allOpen in new window


int to ATL/MFC CString

#include <cstringt.h>
...
int     n;
CString sResult;

sResult.Format( "%d", n );    // use "%u" for unsigned int
                                  
1:
2:
3:
4:
5:
6:

Select allOpen in new window


int to STL std::string

#include <iostream>
#include <sstream>
...
int         n;
std::string sResult;

std::ostringstream ostr;
ostr << n;
sResult= ostr.str();
                                  
1:
2:
3:
4:
5:
6:
7:
8:
9:

Select allOpen in new window



"" title="Convert String to Integer"]
C-style (NULL-terminated char[]) string to int

#include <stdlib.h>
...
char szNumber[12]= "1234567890";
int  nResult;

nResult= atoi( szNumber );
                                  
1:
2:
3:
4:
5:
6:

Select allOpen in new window


ATL/MFC CString to int

#include <cstringt.h>  
...
CString sNumber= "1234567890";
int     nResult;

nResult= atoi( sNumber );  // automatically does LPCSTR(sNumber)
                                  
1:
2:
3:
4:
5:
6:

Select allOpen in new window


STL std::string to int

#include <string>
#include <stdlib.h>
...
std::string sNumber= "1234567890";
int         nResult;

nResult= atoi( sNumber.c_str() );
                                  
1:
2:
3:
4:
5:
6:
7:

Select allOpen in new window



Notes:
  • If you are using the UNICODE character set and supplying an output buffer (as with sprintf and itoa) you'll need to keep in mind that characters are two bytes long.  The normal procedure is to declare character buffers as the TCHAR data type, which will take into consideration the data element size.

  • Output buffer length.
    C++ integers are typically 32-bits, with values as high as billions; the range is:

                     0 to 4,294,967,295 (unsigned)
        -2,147,483,648 to 2,147,483,647 (signed)
                                      
    1:
    2:
    

    Select allOpen in new window

    Thus, the maximum length of the resulting string is 12 characters (including NULL terminator and not including commas or other formatting).

    If you are working with 64-bit integers (called __int64 or long long), the values are as high as quintillions; the range is:

                                 0 to 18,446,744,073,709,551,615 (unsigned)
        -9,223,372,036,854,775,808 to  9,223,372,036,854,775,807 (signed)
                                      
    1:
    2:
    

    Select allOpen in new window

    Thus, the maximum length of the resulting string is 21 characters (including NULL terminator and not including commas or other formatting).


  • Both sprintf and itoa have been termed unsafe (some would say they've been deprecated, others would not use that term) because of the chance that a sloppy programmer might not provide a large enough output buffer.

    The examples show how to use the safer xxx_s variations of these functions as an alternative.  The older functions might write beyond the end of the buffer and stomp on other variables or blow the stack frame -- and cause endless debugging headaches.  Of course, if you are determined to give yourself grief, you can still blow up the "safe" version by passing in the wrong length value...  

    The CString::Format function allocates the buffer for you and takes care to avoid the buffer overrun problem.  The std::ostringstream << (insertion operator) also takes care of the buffer allocation for you.

  • The examples above compile and work under Microsoft VS2008.  Some Microsoft-specific functionality is implied (refer to the references, below, if you worry about these things).  However, there is an excellent chance that at least one of the variations will work for you in your development system, whatever it is.


References:

atoi, _atoi_l, _wtoi, _wtoi_l
http://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
http://msdn.microsoft.com/en-us/library/ybk95axf.aspx

_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow
http://msdn.microsoft.com/en-us/library/yakksftt(VS.80).aspx

String to Numeric Value Functions  (strtoX, et al.)
http://msdn.microsoft.com/en-us/library/53b7b72e(VS.80).aspx

Data Conversion  (ultoX, etc.)
http://msdn.microsoft.com/en-us/library/0heszx3w(VS.80).aspx

CStringT::Format
http://msdn.microsoft.com/en-us/library/aa314327(VS.60).aspx

ostringstream
http://msdn.microsoft.com/en-us/library/6kacs5y3.aspx

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If you liked this article and want to see more from this author,  please click the Yes button near the:
      Was this article helpful?
label that is just below and to the right of this text.   Thanks!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Comments

Add your Comment

Please Sign up or Log in to comment on this article.

Loading Advertisement...

Top C++ Experts

  1. jkr

    81,044

    Master

    0 points yesterday

    Profile
    Rank: Savant
  2. sarabande

    48,120

    0 points yesterday

    Profile
    Rank: Sage
  3. Zoppo

    23,770

    0 points yesterday

    Profile
    Rank: Genius
  4. evilrix

    16,916

    30 points yesterday

    Profile
    Rank: Genius
  5. Infinity08

    15,172

    0 points yesterday

    Profile
    Rank: Genius
  6. ambience

    12,888

    0 points yesterday

    Profile
    Rank: Wizard
  7. duncan_roe

    8,800

    0 points yesterday

    Profile
    Rank: Genius
  8. TommySzalapski

    8,800

    0 points yesterday

    Profile
    Rank: Genius
  9. satsumo

    5,800

    0 points yesterday

    Profile
    Rank: Guru
  10. gtokas

    5,600

    0 points yesterday

    Profile
    Rank: Wizard
  11. masheik

    4,572

    0 points yesterday

    Profile
    Rank: Guru
  12. kuroji

    4,000

    0 points yesterday

    Profile
  13. pepr

    4,000

    0 points yesterday

    Profile
    Rank: Genius
  14. AndyAinscow

    3,332

    0 points yesterday

    Profile
    Rank: Genius
  15. tampnic

    3,332

    0 points yesterday

    Profile
    Rank: Master
  16. phoffric

    3,200

    20 points yesterday

    Profile
    Rank: Genius
  17. navneethegde

    2,900

    0 points yesterday

    Profile
    Rank: Wizard
  18. Orcbighter

    2,832

    2,000 points yesterday

    Profile
    Rank: Master
  19. arnold

    2,800

    0 points yesterday

    Profile
    Rank: Genius
  20. mrwad99

    2,800

    0 points yesterday

    Profile
    Rank: Wizard
  21. giltjr

    2,800

    0 points yesterday

    Profile
    Rank: Genius
  22. ravenpl

    2,800

    0 points yesterday

    Profile
    Rank: Genius
  23. for_yan

    2,800

    0 points yesterday

    Profile
    Rank: Genius
  24. ubound

    2,550

    0 points yesterday

    Profile
    Rank: Master
  25. trinitrotoluene

    2,532

    0 points yesterday

    Profile
    Rank: Guru

Hall Of Fame