C не имеет шаблонов.Одним из решений является передача максимально поддерживаемого целого числа по ширине (uintmax_t
, в Value
ниже) и размера исходного целого числа (в Size
).Одна подпрограмма может использовать размер, чтобы определить количество цифр для печати.Еще одним осложнением является то, что C не предоставляет C ++ std::string
автоматическое управление памятью.Типичный способ справиться с этим в C состоит в том, чтобы вызываемая функция выделяла буфер и возвращала его вызывающей стороне, которая отвечает за его освобождение по завершении.
В приведенном ниже коде показана функция hexify
, которая выполняетэто, а также показывает макрос Hexify
, который принимает один параметр и передает его размер и значение в функцию hexify
.
Обратите внимание, что в C такие символьные константы, как 'A'
имейте тип int
, а не char
, поэтому требуется некоторая осторожность при предоставлении нужного размера.Код ниже содержит пример для этого.
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
char *hexify(size_t Size, uintmax_t Value)
{
// Allocate space for "0x", 2*Size digits, and a null character.
size_t BufferSize = 2 + 2*Size + 1;
char *Buffer = malloc(BufferSize);
// Ensure a buffer was allocated.
if (!Buffer)
{
fprintf(stderr,
"Error, unable to allocate buffer of %zu bytes in %s.\n",
BufferSize, __func__);
exit(EXIT_FAILURE);
}
// Format the value as "0x" followed by 2*Size hexadecimal digits.
snprintf(Buffer, BufferSize, "0x%0*" PRIxMAX, (int) (2*Size), Value);
return Buffer;
}
/* Provide a macro that passes both the size and the value of its parameter
to the hexify function.
*/
#define Hexify(x) (hexify(sizeof (x), (x)))
int main(void)
{
char *Buffer;
/* Show two examples of using the hexify function with different integer
types. (The examples assume ASCII.)
*/
char x = 'A';
Buffer = hexify(sizeof x, x);
printf("Character '%c' = %s.\n", x, Buffer); // Prints "0x41".
free(Buffer);
int i = 123;
Buffer = hexify(sizeof i, i);
printf("Integer %d = %s.\n", i, Buffer); // Prints "0x00007b".
free(Buffer);
/* Show examples of using the Hexify macro, demonstrating that 'A' is an
int value, not a char value, so it would need to be cast if a char is
desired.
*/
Buffer = Hexify('A');
printf("Character '%c' = %s.\n", 'A', Buffer); // Prints "0x00000041".
free(Buffer);
Buffer = Hexify((char) 'A');
printf("Character '%c' = %s.\n", 'A', Buffer); // Prints "0x41".
free(Buffer);
}