如何确定uint8_t的数组长度?

How to determine array length of uint8_t?

我试图在下面的代码中确定 msg 的数组长度。我使用了 strlensizeof 但它们没有 return 6. 我可以使用什么函数来确定 uint8_t 数组的长度或者我如何修改下面的代码 ( osal_DataLenght() 函数)?

int osal_DataLength( char *pString ){
  return (int)( strlen( pString ) );
}

void setNewLevel( uint8_t newLevel ){ //GW specific
  uint8_t msg[8] = {'[=11=]'};
  msg[0] = '0';
  msg[1] = '7';
  msg[6]= newLevel;
  //msg[7] = '0';
  printf("the array length:%d\n", osal_DataLength(msg) );
}

int main(void){
    setNewLevel(0xD5);
    return 0;
}

将数组传递给函数时,它会衰减为指针,函数中无法知道原始数组的长度。将长度作为附加变量传递

int osal_DataLength( char *pString, int size )
. 
.
.
printf("the array length:%d\n", osal_DataLength(msg, sizeof(msg)) );

要知道数组的大小,请写(在 setNewLevel() 中,如 @Dabo 所说):

sizeof(msg)/sizeof(uint8_t);

strlen() returns 字符串的大小(字符数组以 NULL 结尾,即 '[=14=]')。您不能在这种情况下使用它,因为 :

  1. msg[2]msg[5] 值未初始化
  2. msg 不是由 NULL 终止的 char 序列。
strlen(const char *str)

Strlen 函数正在查找“\0”以完成并显示数组长度。所以你首先做所有数组数据 '\0' 然后在你的 setNewLevel 函数中 msg[0]= 0 和 msg[1] = 7 然后 msg[6] = newLevel 但其他的是 '\0' 所以你总是看到长度为 2 。

也许你可以这样使用它。首先,您可以使用 memset 将所有元素数组设置为 ZERO"0" 然后在数组中添加您想要的内容。您必须在使用 '\0' 的数组元素中做最后一件事。如果你像那样使用你可以看到数组长度。

    void setNewLevel( uint8_t newLevel ){ //GW specific
    uint8_t msg[8] = {'[=10=]'};
    memset(msg,'0',8); //  to set all element to zero 
    msg[0] = '0';
    msg[1] = '7';
    msg[6]= newLevel;
    msg[7]= '[=10=]';  // this is array's last element.
    printf("the array length:%d\n", osal_DataLength(msg) );
    }