浮點數轉字串dtostrf,自編代碼,親測可用
最近編c語言程式,要從下位機用藍牙上傳資料,發現sprintf()函式轉浮點數的時候轉出來全是問號’?’,網上搜了下,發現Arduino的dtostrf函式可用,但好像在Arduino自己的庫里,筆者用IAR軟體往K60芯片上燒程式,用不了Arduino,所以自己寫了個dtostrf,親測可用,先上代碼,有需要的自取吧:
// prints a float 'val' to string 'buf'
void dtostrf(double val, int len, int prec, char* buf, int buf_len) {
int int_count = 0;
int index = 0;
//判斷正負
if (val < 0) {
buf[index] = '-';
index ++;
val = -val;
}
//先數一下整數部分長度
while ((int) val > 0) {
val /= 10.0;
int_count++;
}
while (index < len && index < buf_len) {
//如果整數部分結束
if (int_count == 0) {
//如果一上來就是0
if (index == 0) {
buf[index] = '0';
index++;
}
else {
buf[index] = '.';
index++;
int_count--;
}
}
//int_count此時已經是小數長度的相反數
else if ( int_count >= -prec) {
val *= 10.0;
buf[index] = (int)val + '0';
val -= (double)((int)val);
index++;
int_count--;
}
else break;
}
//強制加'\0'
if (index == buf_len) buf[index - 1] = '\0';
else buf[index] = '\0';
}
重要說明
引數說明:
double val:要轉換的浮點型別資料
int len:輸出字串最長顯示長度
int prec:要求小數點精度(小數點后幾位)
char* buf:要存放的字串位置
int buf_len:字串buf的長度
與Arduino的dtostrf不同之處:
① 在最后多加了buf_len引數,即預先創建的buf串長度,防溢位,以及字串陣列占滿了沒有’\0’出問題,更安全(類似sprintf_s)
②輸出永遠沒有空格沒有前導零(Arduino的dtostrf在滿足精度要求但字符數量不足width時會在字串前添加空格)
注意事項:
① 當浮點數翻譯出的結果把buf占滿了,程式會強制在最后加’\0’擠掉最后一位(盡量使用的時候就不要有越界風險吧~)
② 小數點也算在len的長度里!!!
③ 總長度或精度滿足其一即翻譯結束,例如:
dtostrf(20.1234, 6, 5, buf, 10) 會存"20.123"
dtostrf(2.5, 5, 2, buf, 10) 會存"2.50"
代碼測驗:
測驗代碼:
int main() {
char buf[10] = "aefeag";
dtostrf(2.5, 5, 2, buf, 10);
printf("%s\n", buf);
dtostrf(20.1234, 6, 3, buf, 10);
printf("%s\n", buf);
dtostrf(0.98798234, 12, 9, buf, 10);
printf("%s\n", buf);
dtostrf(32, 7, 4, buf, 10);
printf("%s\n", buf);
return 0;
}
輸出結果:

語法也沒有什么特別難的,想自己改也很容易~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/218758.html
標籤:其他
上一篇:STM32F103 串口DMA + 空閑中斷 實作不定長資料收發
下一篇:邊緣計算網關優化工業制造資料采集
