Difference between revisions of "Itoa"

From Gardenology.org - Plant Encyclopedia and Gardening Wiki
Jump to navigationJump to search
 
 
Line 1: Line 1:
{{lowercase|title=itoa}}
 
The '''itoa''' function is a widespread non-standard extension to the standard [[C (programming language)|C programming language]]. It cannot be portably used, as it is not defined in any of the C language standards; however, compilers often provide it through the header &lt;[[stdlib.h]]&gt; while in non-conforming mode, because it is a logical counterpart to the standard library function <code>[[atoi]]</code>.
 
  
:<code>void itoa(int input, char *buffer, int radix)</code>
 
 
<code>itoa</code> takes the integer input value <code>input</code> and converts it to a number [[base (mathematics)|in base]] <code>radix</code>. The resulting number (a sequence of base-<code>radix</code> digits) is written to the output buffer <code>buffer</code>.
 
 
Depending on the implementation, <code>itoa</code> may return a pointer to the first character in <code>buffer</code>, or may be designed so that passing a [[null pointer|null]] <code>buffer</code> causes the function to return the length of the string that ''would have'' been written into a valid <code>buffer</code>.
 
 
For converting a number to a string in base&nbsp;8 (octal), 10 (decimal), or 16 ([[hexadecimal]]), a Standard-compliant alternative is to use the [[C standard library|standard library]] function <code>[[sprintf]]</code>.
 
 
==K&R implementation==
 
The function <code>itoa</code> appeared in the first edition of [[Brian Kernighan|Kernighan]] and [[Dennis Ritchie|Ritchie]]'s ''[[The C Programming Language (book)|The C Programming Language]]'', on page 60. The second edition of ''[[The C Programming Language (book)|The C Programming Language]]'' ("K&R2") contains the following implementation of <code>itoa</code>, on page 64. The book notes several issues with this implementation, including the fact that it does not correctly handle the [[Two's complement#The_weird_number|weird number]]&nbsp;&minus;2<sup>wordsize-1</sup>.<ref>For the solution to this exercise, see [http://clc-wiki.net/wiki/K%26R2_solutions:Chapter_3:Exercise_4 "K&R2 solutions"] on ''clc-wiki.net''.</ref>
 
 
<code lang="c">
 
/* itoa:  convert n to characters in s */
 
void itoa(int n, char s[])
 
{
 
    int i, sign;
 
 
    if ((sign = n) < 0)  /* record sign */
 
        n = -n;          /* make n positive */
 
    i = 0;
 
    do {      /* generate digits in reverse order */
 
        s[i++] = n % 10 + '0';  /* get next digit */
 
    } while ((n /= 10) > 0);    /* delete it */
 
    if (sign < 0)
 
        s[i++] = '-';
 
    s[i] = '\0';
 
    reverse(s);
 
}
 
</code>
 
 
The function <code>reverse</code> is implemented two pages earlier:
 
 
<code lang="c">
 
#include <string.h>
 
 
/* reverse:  reverse string s in place */
 
void reverse(char s[])
 
{
 
    int c, i, j;
 
 
    for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
 
        c = s[i];
 
        s[i] = s[j];
 
        s[j] = c;
 
    }
 
}
 
</code>
 
 
An <code>itoa</code> function (and a similar function, <code>ftoa</code>, that converted a [[floating point|float]] to a string) is listed in the first-edition [[Unix]] manual.<ref>[http://cm.bell-labs.com/cm/cs/who/dmr/1stEdman.html "Unix Programmer's Manual"], November 3, 1971. Section [http://cm.bell-labs.com/cm/cs/who/dmr/pdfs/man31.pdf "Library routines"].</ref> Unlike the versions given above, the Unix library version had an interface roughly equivalent to
 
 
:<code>void itoa(int input, void (*subr)(char))</code>
 
 
and would invoke the [[callback (computer science)|callback routine]] <code>subr</code> on each character in the output string, thus eliminating the need for a buffer big enough to hold the entire string.
 
 
==See also==
 
*[[atoi]]
 
 
==References==
 
<references/>
 
 
==External links==
 
*[http://www.freebookzone.com/others/itoa.h A simple itoa function] - bad example with memory leak
 
*[http://www.freebookzone.com/others/itoa.c itoa example file]
 
*[http://www.jb.man.ac.uk/~slowe/cpp/itoa.html itoa() implementations with performance tests]
 
*[http://boost.org/libs/conversion/lexical_cast.htm lexical_cast] - C++ alternative, part of the boost libraries
 
*[http://code.google.com/p/stringencoders/wiki/NumToA modp_numtoa] - C/C++ alternative for converting integers and floats to char buffers. 5-20x faster than using sprintf
 
*[http://sourceforge.net/projects/itoa/ Good old Integer To Ascii conversion: itoa] - Another fast implementation of itoa for various datatypes, plus some boost-style wrapping in the form of boost::lexical_cast template specializations.
 
 
[[Category:Stdlib.h]]
 

Latest revision as of 05:35, 23 November 2007