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?

Thanks.

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

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
ta*******@rocketmail.com

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.