Charles Curley wrote:
Ah, good. Did you finally get around to looking at the solution I
posted to this thread two days ago?
Yup, it's pretty nice with only a few warts. It doesn't work for zero or
INT_MIN. It also crashes at random points (sometimes after 6700
invocations, sometimes after 5001, sometimes after 8105, etc) when run
in a for loop.
My version skips the strcat() at the end of itoa() in favor of just
returning a char* that points at where my itoa() put the string in the
specified buffer. The caller can then know where to find the int. It
saves a bit of time, but at the slight cost of a somewhat bulky API.
Here's my code:
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <stdlib.h>
// This is a special case. Redefine it for platforms with a different
value of INT_MIN:
#define INT_MIN_STRING "-2147483648"
// Writes the value in ascii into buf, and returns a pointer inside
// buf where the ascii string begins. The string will be null
// terminated
char* itoa( int value, char *buf, int buflen )
{
// Write the number from the end of the buffer, right-to-left:
int pos = buflen - 1;
buf[pos--] = '\0';
// Special case for zero:
if( value == 0 )
{
buf[pos--] = '0';
}
// You can't take the absolute value of INT_MIN, because it would be
too long, and
// overflow INT_MAX, and result in INT_MIN again, so it's a special
case.
else if( value == INT_MIN )
{
strcpy( buf, INT_MIN_STRING );
return buf;
}
// Done with special cases. Do the generic case:
else
{
int i = abs( value );
// Write each 10's place value, starting at the right:
do
{
buf[pos--] = '0' + (i % 10);
}
while( i /= 10 );
// Prepend a negative sign for negative values:
if( value < 0 )
{
buf[pos--] = '-';
}
}
// Return a pointer into the buf where we finished writing
// the front of the string:
return &(buf[pos+1]);
}
--Dave
/*
PLUG: http://plug.org, #utah on irc.freenode.net
Unsubscribe: http://plug.org/mailman/options/plug
Don't fear the penguin.
*/