uintx_t для сопоставления char* в автономном C++ с использованием компилятора GNU

Поэтому я пытаюсь преобразовать некоторые целые числа в символьные массивы, которые мой терминал может записать. так что я могу видеть значение моих кодов расчетов для целей отладки при его запуске. как если бы int_t count = 57 я хотел, чтобы терминал записал 57. таким образом char* будет массивом символов 5 и 7

Однако здесь важно то, что он находится в автономной среде, что означает отсутствие стандартной библиотеки C++. РЕДАКТИРОВАТЬ: это означает, что нет std::string, нет c_str, нет _tostring, я не могу просто напечатать целые числа.

У меня есть доступ к заголовкам iso646,stddef,float,limit, stdint, stdalign, stdarg, stdbool и stdnoreturn

Я пробовал сделать несколько вещей, используя int как константный символ *, который просто приводил к отображению случайных символов. Для подачи в мой компилятор различных заголовков из коллекции GCC, но они просто нуждались в других заголовках, которые я продолжал кормить, пока я не знал, какой заголовок нужен компилятору.

так вот где код должен быть использован для печати.

uint8_t count = 0;
while (true)
{
    terminal_setcolor(3);
    terminal_writestring("hello\n");

    count++;

    terminal_writestring((const char*)count);
    terminal_writestring("\n");
}

Любой совет с этим будет принята с благодарностью.

Я использую кросс-компилятор gnu, g++, предназначенный для 686-эльфа, и я предполагаю, что использую C++11, так как у меня есть доступ к stdnoreturn.h, но это может быть C++14, поскольку я только что собрал компилятор с последней версией Зависимости программного обеспечения GNU.

2 ответа

Решение

Без стандартной библиотеки C/C++ у вас нет опций, кроме написания функции преобразования вручную, например:

template <int N>
const char* uint_to_string(
    unsigned int val,
    char (&str)[N],
    unsigned int base = 10)
{
    static_assert(N > 1, "Buffer too small");
    static const char* const digits = "0123456789ABCDEF";

    if (base < 2 || base > 16) return nullptr;

    int i = N - 1;
    str[i] = 0;

    do
    {
        --i;
        str[i] = digits[val % base];
        val /= base;
    }
    while (val != 0 && i > 0);

    return val == 0 ? str + i : nullptr;
}

template <int N>
const char* int_to_string(
    int val,
    char (&str)[N],
    unsigned int base = 10)
{
    // Output as unsigned.
    if (val >= 0) return uint_to_string(val, str, base);

    // Output as binary representation if base is not decimal.
    if (base != 10) return uint_to_string(val, str, base);

    // Output signed decimal representation.
    const char* res = uint_to_string(-val, str, base);

    // Buffer has place for minus sign
    if (res > str) 
    {
        const auto i = res - str - 1;
        str[i] = '-';
        return str + i;
    }
    else return nullptr;
}

Использование:

char buf[100];
terminal_writestring(int_to_string(42, buf));      // Will print '42'
terminal_writestring(int_to_string(42, buf, 2));   // Will print '101010'
terminal_writestring(int_to_string(42, buf, 8));   // Will print '52'
terminal_writestring(int_to_string(42, buf, 16));  // Will print '2A'
terminal_writestring(int_to_string(-42, buf));     // Will print '-42'
terminal_writestring(int_to_string(-42, buf, 2));  // Will print '11111111111111111111111111010110'
terminal_writestring(int_to_string(-42, buf, 8));  // Will print '37777777726'
terminal_writestring(int_to_string(-42, buf, 16)); // Will print 'FFFFFFD6'

Живой пример: http://cpp.sh/5ras

Вы можете объявить строку и получить указатель на нее:

std::string str = std::to_string(count);
str += "\n";
terminal_writestring(str.c_str());
Другие вопросы по тегам