- itoa (Си)
-
Функция itoa — широко распространённое нестандартное расширение стандартного языка программирования Си. Ее использование не предусматривает переносимости, поскольку эта функция не определена ни в одном стандарте языка Си; тем не менее, зачастую компиляторы поддерживают ее за счет использования заголовка
<stdlib.h>
, причем не совсем в удобном виде, так как она весьма близка по смыслу к стандартной библиотечной функцииatoi
.void* itoa(int input, char *buffer, int radix)
itoa
принимает передаваемое целое числоinput
и конвертирует его в число в основании корняradix
. Полученное число (последовательность цифр основанияradix
) записывается в буфер выводаbuffer
.Аргумент radix определяет основание системы исчисления для input; его значение может лежать в пределах от 2 до 36.
В зависимости от реализации,
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» на сайте clc-wiki.net.
- ↑ «Unix Programmer’s Manual», 3 ноября 1971. Глава «Library routines».
Ссылки
- 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 (рус.)
Категория:- Stdlib.h
Wikimedia Foundation. 2010.