uintx_t const char *在独立C++中使用GNU编译器
所以我想将一些整数转换成我的终端可以写入的字符数组。所以我可以在运行时看到我的代码计算的值用于调试目的。 如如果int_t计数= 57我想要的终端写57. 所以字符*将是5个字符的阵列和7uintx_t const char *在独立C++中使用GNU编译器
这里的起脚虽然是,这是在独立环境中,使得装置没有标准的C++库。 编辑: 这意味着没有std :: string,没有c_str,没有_tostring,我不能只打印整数。
我有机会获得的0646,stddef,浮法,限制,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");
}
任何意见,这将不胜感激。
我正在使用gnu,g ++交叉编译器,目标是686-elf,我想我使用的是C++ 11,因为我有权访问stdnoreturn.h,但它可能是C++ 14,因为我只是构建了编译器与最新的gnu软件依赖关系。
没有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
这是非常好的! –
这是完美的。(除了我有一种感觉,它可能无法与负数一起工作,但我还没有测试) 起初,我必须手动检查每一行,并用我自己的话评论它的剂量,然后才终于完成了它的工作。 但是仍然有一部分我不明白,那就是int N和eavey thingthat跟它在一起 '(&str)[N], int i = N-1, static_assert(N> 1,“Buffer too small” );' 我假设这是将42分为4和2的部分,但我不明白。 – skyline
是的,这个函数不适用于底片,因为提到的问题uintX_t类型为目标。但是改进它很容易,所以它也可以用于底片。 – Rost
你可以宣布一个字符串,得到的指针是:
std::string str = std::to_string(count);
str += "\n";
terminal_writestring(str.c_str());
如果你真的阅读这个问题会更好。 –
_“这里的踢球者是这是在一个独立的环境中,所以这意味着没有标准的C++库。我可以使用的头文件是iso646,stddef,float,limits,stdint,stdalign,stdarg,stdbool和stdnoreturn”_ –
你说:“const char *'”,但你没有真正说出你想要的结果。你想要空格分隔的十进制表示吗?十六进制表示? ASCII编码的字符等值?什么? –
ASCII编码的字符相当于 如果计数= 50我想要50由终端打印 – skyline
那么,这是空格分隔的十进制表示,而不是ASCII选项(在您的示例中,这可能是字符“P”)。请将具体要求添加到问题本身。 –