2017-01-23 132 views
-1

所以我想将一些整数转换成我的终端可以写入的字符数组。所以我可以在运行时看到我的代码计算的值用于调试目的。 如如果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软件依赖关系。

+0

你说:“const char *'”,但你没有真正说出你想要的结果。你想要空格分隔的十进制表示吗?十六进制表示? ASCII编码的字符等值?什么? –

+0

ASCII编码的字符相当于 如果计数= 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

这是完美的。(除了我有一种感觉,它可能无法与负数一起工作,但我还没有测试) 起初,我必须手动检查每一行,并用我自己的话评论它的剂量,然后才终于完成了它的工作。 但是仍然有一部分我不明白,那就是int N和eavey thingthat跟它在一起 '(&str)[N], int i = N-1, static_assert(N> 1,“Buffer too small” );' 我假设这是将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”_ –