浮点数转字符串dtostrf,自编源码,亲测可用

浮点数转字符串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;
}

输出结果:

在这里插入图片描述
语法也没有什么特别难的,想自己改也很容易~

猜你喜欢

转载自blog.csdn.net/BBBBBHY/article/details/109641537