5

我正在尝试确定msg以下代码的数组长度。我使用了strlensizeof但它们不返回 6。我可以使用什么函数来确定uint8_t数组的长度或如何修改以下代码(osal_DataLenght()func)?

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

void setNewLevel( uint8_t newLevel ){ //GW specific
  uint8_t msg[8] = {'\0'};
  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;
}
4

4 回答 4

6

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

sizeof(msg)/sizeof(uint8_t);

strlen()NULL返回字符串的大小(以, ie结尾的字符数组'\0')。您不能在这种情况下使用它,因为:

  1. msg[2]tomsg[5]值未初始化
  2. msg不是由char终止的序列NULL
于 2015-04-16T11:26:56.050 回答
1

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

int osal_DataLength( char *pString, int size )
. 
.
.
printf("the array length:%d\n", osal_DataLength(msg, sizeof(msg)) );
于 2015-04-16T11:21:55.897 回答
0
strlen(const char *str)

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

于 2015-04-16T11:40:47.957 回答
-1

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

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