1

I am trying to convert an integer to char array and I came across this piece of code

int i = 5;
std::string s;
std::stringstream out;
out << i;
s = out.str();

But when I try to print the value of s it still prints 5. I don't know if its supposed to do that or am I doing something wrong? Besides I would prefer if I could convert the same int to char array. But I would appreciate any help in the matter. Thanks! Code taken from: Alternative to itoa() for converting integer to string C++?

3
  • 11
    What do you want it to print? The textual representation of the number 5 is "5". Commented Apr 5, 2011 at 17:06
  • I was just trying to see what the textual representation would be. Does this mean if I try to convert any large numbers to text they would still be the same numbers? For example if I've -635997, what would that look like? Because right now it gives me same number Commented Apr 5, 2011 at 17:09
  • What else could it be? What is the textual representation of -635997, if not "-635997"? A given number has many possible textual representations; by default, you get the simplest and most familiar (decimal, no leading 0's). There are flags you can set to get other representations. Commented Apr 6, 2011 at 8:54

3 Answers 3

4

Yes, it's supposed to do that. You'd (primarily) notice the difference from just printing a number out directly if you do some other string-type manipulation on the result (e.g., concatenating it with other strings, searching for characters in the string).

Just for example:

std::cout << i+i;   // should print "10"
std::cout << s+s;   // should print "55"
Sign up to request clarification or add additional context in comments.

Comments

1

Besides I would prefer if I could convert the same int to char array.

char *charPtr = new char[ s.length() + 1 ] ; // s is the string in the snippet posted
strcpy( charPtr, s.c_str() ) ;

// .......

delete[] charPtr ; // Should do this, else memory leak.

6 Comments

just wondering shouldn't the argument to strlen() be a char pointer? or would the string act the same way?
@Max Eastman : No, you're correct -- passing a std::string to strlen is illegal. It should be new char[s.length() + 1]; or new char[strlen(s.c_str()) + 1];, but of course the second one is inherently less efficient.
@ildjarn - You are correct. Time for me to take rest, I guess :)
@Mahesh : std::auto_ptr uses delete rather than delete [], so std::auto_ptr<char> would cause undefined behavior here. On C++0x compilers std::unique_ptr<char[]> would be preferred; on older compilers, boost::scoped_array or boost::shared_array are the best options.
@Mahesh : Speaking of which, your code should have delete [] charPtr; rather than delete charPtr; ;-]
|
1

If you would like to stop worrying about issues like that you might be interested in boost/lexical_cast.hpp.

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

int main() {
  const int i=5;
  const char* s = boost::lexical_cast<std::string>(i).c_str();
  std::cout << s << std::endl;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.