-1

所以我试图将一些整数转换为我的终端可以写入的字符数组。所以我可以在运行时看到我的代码计算值以进行调试。就像 int_t count = 57 我希望终端写 57。所以 char* 将是 5 和 7 的字符数组

不过这里的关键是这是在一个独立的环境中,所以这意味着没有标准的 c++ 库。编辑:这意味着没有 std::string,没有 c_str,没有 _tostring,我不能只打印整数。

我可以访问的标头是 iso646、stddef、float、limits、stdint、stdalign、stdarg、stdbool 和 stdnoreturn

我已经尝试了一些将 int 转换为 const char* 的方法,女巫只是导致显示随机字符。从 GCC 集合中为我的编译器提供不同的头文件,但他们只是一直需要其他头文件,我继续提供它,直到我不知道编译器想要什么头文件。

所以这里是需要打印代码的地方。

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

    count++;

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

对此的任何建议将不胜感激。

我正在使用针对 686-elf 的 gnu、g++ 交叉编译器,我想我正在使用 C++11,因为我可以访问 stdnoreturn.h 但它可能是 C++14,因为我只是用最新的编译器构建了gnu 软件依赖项。

4

2 回答 2

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 = "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

于 2017-01-23T12:40:21.647 回答
-2

您可以声明一个字符串并获取指向它的指针:

std::string str = std::to_string(count);
str += "\n";
terminal_writestring(str.c_str());
于 2017-01-23T12:14:10.583 回答