0

我在使用 itoa() 打印字节值 (uint8_t) 时遇到困难,需要打印一定百分比的音量。我想使用这个函数,因为它减少了二进制大小。

updateStats 函数的两个版本(使用 OLED_I2C 库在 oled 显示器上打印统计信息:OLED display(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() 函数会打印错误的数字吗?任何解决方案如何解决这个问题?

4

1 回答 1

1

这条线itoa( (uint8_t)getVolume() ,&buff[2],7 ); // get percent是错误的。

当您想要以 10 为底时,您要求以 7 为底的数字。

这是一个快速计算:

99 ÷ 7 = 14 r 1
14 ÷ 7 = 2 r 0
∴ 99 10 = 201 7

完整代码

更正后的示例如下所示:

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 );  
}
于 2017-03-16T07:47:00.373 回答