Функция 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.Решение этого вопроса смотри «K&R2 solutions» на сайте clc-wiki.net.

/* 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.«Unix Programmer’s Manual» , 3 ноября 1971. Глава «Library routines» . В отличие от приведённых выше версий, библиотечная Unix-версия имела интерфейс, примерно похожий на

void itoa(int input, void (*subr)(char))

и вызывала подпрограмму обратного вызова subr для каждого символа в строке вывода, что устраняло необходимость в большом буфере для хранения сразу всей строки.

См. также atoi

Примечания

Ссылки 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