keil下sprintf格式化浮点数导致死机

单片机:STC12C5A系统

环境:Keil

现象:调用sprintf格式化浮点数时程序死机,如:

    sprintf(dispCharArray,"%5.1f",ch_value);

解决方法:

参考了网上的说法,认为是字节对齐问题导致的,暂时采用自己实现类似sprintf功能方法来解决,代码如下:

 //不足位数的补空格
void Short2Str(char s[], int len, short val)
{
    char   *p;
    char   sign = 0;
    unsigned int digval;

    p = s;

    if (val < 0)
    {
        //*p++ = '-';
        sign = 1;
        val = (unsigned int)(-(int)val);
    }
    p += len;
    *p-- = '\0';
    do
    {
        digval = (unsigned int)(val % 10);
        val /= 10;
        *p-- = (char)(digval + '0');
    }
    while ((val > 0) && (p >= s)); 
    if (sign) { *p-- = '-'; }//将负号加到数据前面

    while (p >= s) { *p-- = ' '; } 

}
//不足规定位数的前面补'0‘
void Short2StrBy0(char s[], int len, short val)
{
    char   *p;
    char   sign = 0;
    unsigned int digval;

    p = s;

    if (val < 0)
    {
        //*p++ = '-';
        sign = 1;
        val = (unsigned int)(-(int)val);
    }
    p += len;
    *p-- = '\0';
    do
    {
        digval = (unsigned int)(val % 10);
        val /= 10;
        *p-- = (char)(digval + '0');
    }
    while ((val > 0) && (p >= s)); 
    if (sign) { *p-- = '-'; }//将负号加到数据前面

    while (p >= s) { *p-- = '0'; } 

}
void Float2Str(char s[], int len,int digits, float valf)
{

	int mlen=len;
	short m=(short)valf;				//整数部分
	short n=0;							//小数部分	
	if(digits>3)digits=3;
	if(digits==0)						//如果小数位数为0,则直接返回整数部分
	{		
		Short2Str(s,mlen,m);
		return;
	}
	else if(digits==1)
		n=((short)(fabs(valf)*10))%10;
	else if(digits==2)
		n=((short)(fabs(valf)*100))%100;
	else if(digits==3)
		n=((short)(fabs(valf)*1000))%1000;	
	
	mlen=len-digits-1;
	Short2Str(s,mlen,m);                //格式化整数部分
	*(s+mlen)='.';                      //添加小数点  
	Short2StrBy0(s+mlen+1,digits,n);     //格式化小数部分
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值