Меню
Главная
Случайная статья
Настройки
|
Функция 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 года..
Ссылки
|
|