470,833 Members | 1,956 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 470,833 developers. It's quick & easy.

Re: Integer to string conversion

pradeep wrote:
Hello friends:

I know some people here don't like to answer C++ questions, but I
believe this is really about the underlying C code. Anyway I have
posted as well to the other group someone suggested
("comp.lang.c++") just in case.

I think the problem is that in my C++ class, we were taught to use
cin, cout etc. but now I need to use the primitive C operations
printf etc. and I don't understand exactly how they work.

I'm trying to convert an integer into a string. Here's what I'm
trying, but when I try to output the string returned from the
function, I just get garbage. How should I be using sprintf?


char *App::IntToString(int i) //doesn't really rely on classes
char buf[2];
Not big enough by far and disappears once IntToString finishes.
char *out = buf;
No reason to have to do this.
sprintf(out, "%d", i);
sprintf( buf, "%d", i );
would also work, although there are hte other problems.
return out;
you are returning a pointer to a buffer that goes out of scope when the
function returns.
So, how to fix this? Simplest is to make the buffer static so it doesn't
disappear when the function returns and make it big enough. char buf[2];
is only large enough to hold "0" through "9". An integer can hold quite a
larger value, however. 10 or 11 digits I think.

char *App::IntToString(int i) //doesn't really rely on classes
static char buf[12];
sprintf(buf, "%d", i);
return buf;

Shoudl fix the immediate errors, but does not fix any design issues. Such
as the fact if you called this twice in a row, both returned char*'s would
point to the same value. I.E.

char* Value1;
char* Value2;

Value1 = IntToString( 10 );
Value2 = IntToString( 11 );

std::cout << Value1 << " " << Value2;

would output 11 11 since the pointers returned by IntToString are identical,
and the static buffer was changed.

It is better to return a std::string. You can do the conversion either as is
and convert to a std::string, or use use std::stringstream. (Untested

std::string App::IntToString( int i )
std::stringstream Convert;
Convert << i;
std::string Answer;
Convert >Answer;

return Convert.string();

Personally, I use a template for this.

template<typename T, typename F T StrmConvert( const F from )
std::stringstream temp;
temp << from;
T to = T();
temp >to;
return to;

template<typename Fstd::string StrmConvert( const F from )
return StrmConvert<std::string>( from );

So I can do:

std::string Value = StrmConvert( 10 );

or even:

int Value = StrmConvert<int>( "10" );

Note that my StrmConvert does not have any error checking, any errors would
simply return a default constructed value. I.E. If you tried to convert
"xyz" to an int the result would be 0.
Jim Langston

Jun 27 '08 #1
0 1097

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

8 posts views Thread by Brent Lievers | last post: by
5 posts views Thread by Barry | last post: by
7 posts views Thread by Spoon | last post: by
5 posts views Thread by pradeep | last post: by
reply views Thread by mihailmihai484 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.