-5

weather.outdooe_tempfloat每次我按下按钮时都会更新的值。set_temp是一个float功能ascii。如果我使用它,那么它会起作用,但如果我使用下面的代码则不会。

char Thermo_Buff66[4];
static void SetBox(ScreenObj_t const *pS, EVENT_MSG const *pMsg)
{
    //set_temp(weather.outdoor_temp,&a);//it works if i use this function.
    sprintf(Thermo_Buff66,"%2.1f",weather.outdoor_temp);
    (void)sprintf(Thermo_Buff,"%s\xc2\xb0""",Thermo_Buff66);
    (void)DataBoxHandler(pS, &msg, "Set Temp", (uint8_t *)Thermo_Buff);

    //currently displaying any # value....!!ing!!
 }
4

1 回答 1

1
char Thermo_Buff66[4];
sprintf(Thermo_Buff66,"%2.1f",weather.outdoor_temp);

您分配的缓冲区 ( Thermo_Buff66) 对于表示室外温度(通常为 2 位)加上后面加一个数字的浮点数来说太短了.。确实,它没有空间用于终止'\0'字符。因此,立即更正将大小设置为5. 尽管如此,在世界末日的情况下(或者只是在一个非 SI 国家......咳嗽......美国),温度甚至可​​能达到 100 以上,在这种情况下,您再次溢出缓冲区。帮自己一个忙并使用snprintf.

无论如何,您进入sprintf缓冲区,然后将其用于其他东西,这是没有意义的。您可以直接在一个中完成所有操作,完全删除:%ssprintfThermo_Buff66

(void)sprintf(Thermo_Buff, "%.1f\xc2\xb0", weather.outdoor_temp);
(void)DataBoxHandler(pS, &msg, "Set Temp", (uint8_t *)Thermo_Buff);

旁注:.和 精度数字已经占用 2 个字符。因此,将最小宽度设置为 2 是多余的。也许您认为 2 in%2.1是 ? 之前的位数.?好吧,事实并非如此。这是最小的整体宽度。

于 2013-03-14T11:24:06.907 回答