利用sprintf與snprintf巧妙實現數值變量轉換為字符串型
0.前情提要
這是在搞STM32開發時遇到的一個問題,要將數字通過串口發送給上位機,但是HAL庫中的HAL_UART_Transmit函數只接受uint8_t *類型的參數,因此我們需要通過一個函數先將數值類型變量轉換為char *字符串,再強制類型轉換為uint8_t *類型的數組。經過上網查詢,我發現sprintf函數與snprintf函數可以方便的解決這個問題。
1.直!接!來!吧!
該函數的原型為int sprintf(char *dest, const char *format, ...);,其中*dest為格式化字符串的緩沖區,*format為格式化字符串(后面的參數用法和printf函數幾乎一樣,可以理解為該函數就讓是printf函數原本輸出到屏幕上的內容輸出到*dest中。)
示例代碼:
點擊查看代碼
char* intToString(int num) {
static char buffer[20]; // 靜態數組,足夠存儲32位整數
snprintf(buffer, sizeof(buffer), "%d", num);
return buffer;
}
該方法有可能輸出內容太長導致緩沖區溢出,不過對于一般的應用場景來說足夠用了。
為了防止這種狀態的發生,可以使用snprintf()函數,該函數的原型為int snprintf ( char * str, size_t size, const char * format, ... );,其中size參數為要寫入的字符的最大數目。如果格式化后的字符串長度超過了size-1,則snprintf()只會寫入size-1個字符,并在字符串的末尾添加一個空字符(\0)以表示字符串的結束。
這兩個函數的返回值規則是一樣的:
- 如果成功,返回將要寫入的字符數(不包括結尾的空字符),即使這個值大于
size。 - 如果發生編碼錯誤,返回負值。
先寫這么多吧我要睡了明天怎么還有早八高數啊啊啊啊啊

浙公網安備 33010602011771號