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 <[[stdlib.h]]> 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 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]] −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]]
| |