2017-01-23 128 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」_ –