2017-01-23 4 views
-1

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

Кикер здесь, однако, что это находится в автономной среде, так что это означает нет стандартной библиотеки C++. EDIT: это означает Нет std :: string, no c_str, no _tostring, я не могу просто печатать целые числа.

Заголовки У меня есть доступ к являются ISO646, stddef, поплавок, пределы, stdint, stdalign, stdarg, stdbool и stdnoreturn

Ive пытался несколько вещей от литья ИНТ как сопзЬ символ *, ведьма просто привел для отображения случайных символов. Чтобы кормить мои компиляторы разными заголовками из коллекции 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.

+0

Вы говорите «const char *», но на самом деле вы не сказали, на что вы хотите, чтобы результат выглядел. Вам нужны десятичные представления с разделителями в пространстве? Шестнадцатеричные представления? ASCII-кодированные эквиваленты символов? Какие? –

+0

Символьные эквиваленты, кодированные ASCII , если count = 50, я хочу, чтобы 50 напечатано терминалом – skyline

+0

Ну, это десятичное представление с разделителями с пробелами, а не ASCII-вариант (который в вашем примере будет символом 'P'). Пожалуйста, добавьте особые требования к самому вопросу. –

ответ

1

Без ++ стандартной библиотеки 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 = "ABCDEF"; 

    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

+0

Это очень приятно! –

+0

Это прекрасно.(за исключением того, что у меня есть чувство, что это может не сработать с отрицательными номерами, я еще не проверял это) сначала мне пришлось вручную пройти через каждую строку и прокомментировать мои собственные слова, что она дозу, прежде чем я, наконец, отработал ее, что он сделал , однако до сих пор Theres одну часть я не понимаю, и это Int N и eavey thingthat идет с ним '(& Обл) [N], INT I = N-1, static_assert (N> 1, "Буфер слишком мал"); ' Я предполагаю, что это та часть, которая разбивает 42 на 4 и 2, но как я не понимаю. – skyline

+0

Да, эта функция не будет работать с негативами, так как вопрос, упомянутый в качестве цели, относится к uintX_t. Но его легко улучшить, поэтому он будет работать и с негативами. – Rost

-2

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

std::string str = std::to_string(count); 
str += "\n"; 
terminal_writestring(str.c_str()); 
+0

Было бы лучше, если бы вы действительно прочитали вопрос. –

+0

_ «Кикер здесь, хотя это то, что это в автономной среде, поэтому это означает, что нет стандартной библиотеки C++. У заголовков, к которым у меня есть доступ, являются iso646, stddef, float, limits, stdint, stdalign, stdarg, stdbool и stdnoreturn» _ –