Пара небольших подпрограмм, которые будут делать то, что вы хотите, без библиотеки printf()
. Обратите внимание, что у подпрограмм нет способа сказать вам, что переданный вами int слишком велик для переданного размера буфера - я оставлю это добавление в качестве упражнения для читателя. Но они безопасны от переполнения буфера (если я не оставил там ошибку).
void uint_to_str_leading( char* dst, unsigned int i, size_t size )
{
char* pCurChar;
if (size == 0) return;
pCurChar = dst + size; // we'll be working the buffer backwards
*--pCurChar = '\0'; // take this out if you don't want an ASCIIZ output
// but think hard before doing that...
while (pCurChar != dst) {
int digit = i % 10;
i = i /10;
*--pCurChar = '0' + digit;
}
return;
}
void int_to_str_leading( char* dst, int i, size_t size )
{
if (size && (i < 0)) {
*dst++ = '-';
size -= 1;
i *= -1;
}
uint_to_str_leading( dst, i, size);
return;
}
Обратите внимание, что эти подпрограммы передают размер буфера и заканчиваются символом '\ 0', так что ваши результирующие строки будут иметь на один символ меньше размера, который вы передали (так что не просто передавайте размер поля ищем).
Если вам не нужен завершающий символ '\ 0', потому что вы имеете дело с фиксированным массивом char [], который не завершен, то достаточно просто извлечь одну строку кода, которая выполняет завершение (но, пожалуйста, рассмотрите возможность завершения массива char [] - если вы этого не сделаете, держу пари, вы увидите по крайней мере одну ошибку, связанную с этим, в течение следующих 6 месяцев).
Изменить, чтобы ответить на несколько вопросов:
dst
- указатель на буфер назначения. Вызывающая сторона должна иметь место для размещения строки, созданной функцией, во многом как стандартная библиотечная функция strcpy()
.
Указатель pCurChar
- это указатель на местоположение, куда пойдет следующий произведенный цифровой символ. Он используется немного по-другому, чем большинство символьных указателей, потому что алгоритм начинается в конце буфера и движется к началу (это потому, что мы получаем цифры от «конца» целого числа). На самом деле, pCurChar указывает сразу за тем местом в буфере, куда он собирается поместить следующую цифру. Когда алгоритм добавляет цифру в буфер, он уменьшает указатель , прежде чем разыменовывает его. Выражение:
*--pCurChar = digit;
Эквивалентно:
pCurChar = pCurChar-1; /* move to previous character in buffer */
*pCurChar = digit;
Он делает это, потому что проверка того, когда мы закончим, это:
while (pCurChar == dst) { /* when we get to the start of the buffer we're done */
Вторая функция - это простая процедура, которая обрабатывает целые числа со знаком, превращая отрицательные числа в положительные и позволяя 1-й функции выполнять всю настоящую работу, например:
- помещая символ '-' в начале буфера,
- настройка указателя и размера буфера и
- отрицание числа, чтобы сделать его положительным
- передача этого значения в функцию, которая преобразует целое число без знака для выполнения реальной работы
Пример использования этих функций:
char buffer[80];
uint_to_str_leading( buffer, 0, 5);
printf( "%s\n", buffer);
uint_to_str_leading( buffer, 123, 6);
printf( "%s\n", buffer);
uint_to_str_leading( buffer, UINT_MAX, 14);
printf( "%s\n", buffer);
int_to_str_leading( buffer, INT_MAX, 14);
printf( "%s\n", buffer);
int_to_str_leading( buffer, INT_MIN, 14);
printf( "%s\n", buffer);
Который производит:
0000
00123
0004294967295
0002147483647
-002147483648