Arduino:itoa 打印 201,sprintf 打印预期的 99
Arduino: itoa prints 201 and sprintf prints the intended 99
我在使用 itoa() 打印字节值 (uint8_t) 时遇到困难,需要打印体积的百分比。我想使用这个函数,因为它减少了二进制文件的大小。
updateStats 函数的两个版本(使用 OLED_I2C 库在 oled 显示器上打印统计信息:OLED 显示器(SDA、SCL、8);):
ITOA(不工作,打印 V:201%)
void updateStats()
{
char buff[10]; //the ASCII of the integer will be stored in this char array
memset(buff, 0, sizeof(buff));
buff[0] = 'V';
buff[1] = ':';
itoa( (uint8_t)getVolume() ,&buff[2],7 ); // get percent
strcat( buff,"%" );
display.print( getInputModeStr(), LEFT , LINE3 );
display.print( buff, RIGHT , LINE3 );
}
SPRINTF(按预期工作,打印 V:99%)
void updateStats()
{
char buff[10]; //the ASCII of the integer will be stored in this char array
memset(buff, 0, sizeof(buff));
sprintf(buff, "V:%d%%", (uint8_t)getVolume() ); // get percent
display.print( getInputModeStr(), LEFT , LINE3 );
display.print( buff, RIGHT , LINE3 );
}
问题
知道为什么 itoa() 函数打印出错误的数字吗?任何解决方案如何解决这个问题?
这一行 itoa( (uint8_t)getVolume() ,&buff[2],7 ); // get percent
是错误的。
当你想要以 10 为基数时,你要求以 7 为基数的数字。
这是一个快速计算:
99 ÷ 7 = 14 r 1
14 ÷ 7 = 2 r 0
∴ 9910 = 2017
完整代码
修改后的例子如下:
void updateStats()
{
char buff[10]; //the ASCII of the integer will be stored in this char array
memset(buff, 0, sizeof(buff));
buff[0] = 'V';
buff[1] = ':';
itoa( (uint8_t)getVolume() ,&buff[2], 10 ); // get percent
strcat( buff,"%" );
display.print( getInputModeStr(), LEFT , LINE3 );
display.print( buff, RIGHT , LINE3 );
}
我在使用 itoa() 打印字节值 (uint8_t) 时遇到困难,需要打印体积的百分比。我想使用这个函数,因为它减少了二进制文件的大小。
updateStats 函数的两个版本(使用 OLED_I2C 库在 oled 显示器上打印统计信息:OLED 显示器(SDA、SCL、8);):
ITOA(不工作,打印 V:201%)
void updateStats()
{
char buff[10]; //the ASCII of the integer will be stored in this char array
memset(buff, 0, sizeof(buff));
buff[0] = 'V';
buff[1] = ':';
itoa( (uint8_t)getVolume() ,&buff[2],7 ); // get percent
strcat( buff,"%" );
display.print( getInputModeStr(), LEFT , LINE3 );
display.print( buff, RIGHT , LINE3 );
}
SPRINTF(按预期工作,打印 V:99%)
void updateStats()
{
char buff[10]; //the ASCII of the integer will be stored in this char array
memset(buff, 0, sizeof(buff));
sprintf(buff, "V:%d%%", (uint8_t)getVolume() ); // get percent
display.print( getInputModeStr(), LEFT , LINE3 );
display.print( buff, RIGHT , LINE3 );
}
问题
知道为什么 itoa() 函数打印出错误的数字吗?任何解决方案如何解决这个问题?
这一行 itoa( (uint8_t)getVolume() ,&buff[2],7 ); // get percent
是错误的。
当你想要以 10 为基数时,你要求以 7 为基数的数字。
这是一个快速计算:
99 ÷ 7 = 14 r 1
14 ÷ 7 = 2 r 0
∴ 9910 = 2017
完整代码
修改后的例子如下:
void updateStats()
{
char buff[10]; //the ASCII of the integer will be stored in this char array
memset(buff, 0, sizeof(buff));
buff[0] = 'V';
buff[1] = ':';
itoa( (uint8_t)getVolume() ,&buff[2], 10 ); // get percent
strcat( buff,"%" );
display.print( getInputModeStr(), LEFT , LINE3 );
display.print( buff, RIGHT , LINE3 );
}