We help IT Professionals succeed at work.

We've partnered with Certified Experts, Carl Webster and Richard Faulkner, to bring you a podcast all about Citrix Workspace, moving to the cloud, and analytics & intelligence. Episode 2 coming soon!Listen Now

x

# itoa function (not atoi)

on
Medium Priority
2,087 Views
I'm looking for a standard function to do integer-to-string conversion.  The comp.lang.c FAQ says to just use sprintf, but I'd rather live without that cruft.  I could swear I found just such a function once while browsing through man pages, but can't locate it again.
Comment
Watch Question

## View Solution Only

Commented:
Depends on your platform I guess. My borland compiler supports the following function:

char *itoa(int value, char *string, int radix);

It is documented in the DOS reference, but mentions portability to the win16, win32 and OS/2 platforms. It also says that it is not standard available in ANSI C, ANSI C++ and UNIX.

Not the solution you were looking for? Getting a personalized solution is easy.

Commented:
Oops, I should've specified unix.  I guess I'll have to ask again.  Thanks for the reply.

Commented:
After consulting a UNIX Sun Solaris system I came up with the following two from the atoi(3) man page:

char *lltostr(long long value, char *ptr);
char *ulltostr(unsigned long long value, char *ptr);

Otherwise a standard itoa is not very difficult:

char *itoa(int val, char *ptr)
{
int sign = (val < 0) ? -1 : 1;
char tmp[16];
int i = 0, j = 0;

val = sign * val;
while (val != 0) {
tmp[i] = (val % 10) + '0';
val = val / 10;
i++;
}
if (i == 0) {
strcpy(ptr, "0");
} else {
if (sign == -1) {
ptr[j] = '-';
j++;
}
while (i != 0) {
ptr[j] = tmp[i - 1];
i--;
j++;
}
ptr[j] = '\000';
}
}

While this may not be the most efficient solution or it may not even work, as I completely did this without a compiler and some test cases, it shows that the base-10 algorithm is not difficult.

Although I agree that a library function would be better, so you don't have to invent and test such trivial stuff...

Commented:
Thanks for snooping around...I'd found the Solaris functions too, but they don't exist on the other platforms I compile for.  I ended up just writing itoa, ltoa, utoa, and ultoa:

const char *itoa( int n )
{
static char buf[32]; /* yeech */
sprintf( buf, "%d", n );
return buf;
}

Now I've just gotta find out how to do thread-specific static
function data (on all those platforms).  *That* sort of thing is the hard part on library functions like this.  The logic is, as you say, trivial.

Commented:
There are several solutions:
1. require the caller to pass a valid character buffer

2. malloc the space and require the caller to free it

I find the first solution the 'most' clean.

##### Thanks for using Experts Exchange.

• View three pieces of content (articles, solutions, posts, and videos)
• Ask the experts questions (counted toward content limit)
• Customize your dashboard and profile