itoa (Си)
Функция itoa в языке программирования C возвращает запись указанного целого числа в позиционной системе счисления с заданным основанием (например число 10 в системе счисления с основанием 7 записывается как "13"). Эта функция не определена ни в одном стандарте языка Си, но зачастую компиляторы поддерживают её за счет использования заголовка <stdlib.h>
, так как она весьма близка по смыслу к стандартной библиотечной функции atoi
.
void* itoa(int input, char *buffer, int radix)
itoa
принимает передаваемое целое число input
и возвращает его запись в системе счисления по основанию radix
(которое должно принимать значения от 2 до 36). Алфавит вывода состоит из 36 знаков - сначала 10 арабских цифр, затем 26 букв стандартной латиницы. Полученное число (последовательность цифр основания radix
) записывается в буфер вывода buffer
.
В зависимости от реализации, itoa
может возвращать указатель на первый символ в буфере buffer
, или может быть создана таким образом, чтобы передавать нуль-buffer
, в результате чего функция возвращает длину строки, которая была записана в корректный buffer
.
Для преобразования числа в строку с основанием 8 (восьмеричная), 10 (десятичная) или 16 (шестнадцатеричная система счисления) альтернативой, совместимой со стандартом, является использование стандартной библиотечной функции sprintf
.
Реализация от Кернигана и Ритчи
[править | править код]Функция itoa
появилась в первом издании книги Брайана Кернигана и Дениса Ритчи Язык программирования Си, на странице 60. Второе издание Язык программирования Си («K&R2») на стр. 64 содержало нижеследующую реализацию itoa
. В книге отмечено несколько вопросов, связанных с этой реализацией, включая тот факт, что она не в состоянии корректно обработать самое маленькое отрицательное число −2длина машинного слова в битах-1.[1]
/* itoa: конвертируем n в символы в s */
void itoa(int n, char s[])
{
int i, sign;
if ((sign = n) < 0) /* записываем знак */
n = -n; /* делаем n положительным числом */
i = 0;
do { /* генерируем цифры в обратном порядке */
s[i++] = n % 10 + '0'; /* берем следующую цифру */
} while ((n /= 10) > 0); /* удаляем */
if (sign < 0)
s[i++] = '-';
s[i] = '\0';
reverse(s);
}
Функция reverse
реализована двумя страницами ранее:
#include <string.h>
/* reverse: переворачиваем строку s на месте */
void reverse(char s[])
{
int i, j;
char c;
for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
c = s[i];
s[i] = s[j];
s[j] = c;
}
}
Функция itoa
(а также схожая с ней функция ftoa
, конвертирующая числа с плавающей запятой в строку) указана в первой версии руководства по Unix.[2] В отличие от приведённых выше версий, библиотечная Unix-версия имела интерфейс, примерно похожий на
void itoa(int input, void (*subr)(char))
и вызывала подпрограмму обратного вызова subr
для каждого символа в строке вывода, что устраняло необходимость в большом буфере для хранения сразу всей строки.
См. также
[править | править код]Примечания
[править | править код]- ↑ Решение этого вопроса смотри «K&R2 solutions» Архивная копия от 3 марта 2010 на Wayback Machine на сайте clc-wiki.net.
- ↑ «Unix Programmer’s Manual» Архивировано 18 мая 2008 года., 3 ноября 1971. Глава «Library routines» Архивировано 9 мая 2008 года..
Ссылки
[править | править код]- string itoa(int n) — Функция C++ конвертации int в string (без утечек памяти!) (англ.)
- How do I use itoa() with GCC? — реализации itoa() с тестами производительности (англ.)
- lexical_cast — альтернатива для C++, часть библиотек boost (англ.)
- modp_numtoa — альтернатива для C/C++ для преобразования целых и чисел с плавающей точкой в символы. (англ.)
- Good old Integer To Ascii conversion: itoa — Еще одна достаточно быстрая реализация itoa для различных типов данных, плюс некоторая обертка в стиле boost в виде специализаций шаблона boost::lexical_cast (англ.).
- Описание itoa (рус.)