Hello friends:Not big enough by far and disappears once IntToString finishes.
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];
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