uintx_t 到使用 GNU 编译器的独立 C++ 中的 const char*
uintx_t to const char* in freestanding c++ using GNU compiler
所以我正在尝试将一些整数转换为我的终端可以写入的字符数组。所以我可以在 运行 时看到我的代码计算值以用于调试目的。
就像 int_t count = 57 我希望终端写入 57。
所以 char* 将是一个字符数组 5 和 7
这里的关键在于这是一个独立的环境,所以这意味着没有标准的 c++ 库。
编辑:
这意味着没有 std::string、没有 c_str、没有 _tostring,我不能只打印整数。
我可以访问的 header 是 iso646、stddef、float、limits、stdint、stdalign、stdarg、stdbool 和 stdnoreturn
我尝试了一些方法,将 int 转换为 const char*, 只是导致显示随机字符。为我的编译器提供与 GCC collection 不同的 headers 但他们只是一直需要其他 headers 我继续提供它直到我不知道 header 编译器想要什么.
所以这里是需要打印代码的地方
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 软件依赖项构建了编译器。
您可以声明一个字符串并获取指向它的指针:
std::string str = std::to_string(count);
str += "\n";
terminal_writestring(str.c_str());
如果没有 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'
所以我正在尝试将一些整数转换为我的终端可以写入的字符数组。所以我可以在 运行 时看到我的代码计算值以用于调试目的。 就像 int_t count = 57 我希望终端写入 57。 所以 char* 将是一个字符数组 5 和 7
这里的关键在于这是一个独立的环境,所以这意味着没有标准的 c++ 库。 编辑: 这意味着没有 std::string、没有 c_str、没有 _tostring,我不能只打印整数。
我可以访问的 header 是 iso646、stddef、float、limits、stdint、stdalign、stdarg、stdbool 和 stdnoreturn
我尝试了一些方法,将 int 转换为 const char*, 只是导致显示随机字符。为我的编译器提供与 GCC collection 不同的 headers 但他们只是一直需要其他 headers 我继续提供它直到我不知道 header 编译器想要什么.
所以这里是需要打印代码的地方
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 软件依赖项构建了编译器。
您可以声明一个字符串并获取指向它的指针:
std::string str = std::to_string(count);
str += "\n";
terminal_writestring(str.c_str());
如果没有 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'