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.
*/

Reply via email to