单片机: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); //格式化小数部分
}