如何确定uint8_t的数组长度?

时间:2015-04-16 11:17:48

标签: c arrays strlen uint8t

我正在尝试在下面的代码中确定msg的数组长度,我使用了strlen和sizeof但是它们没有返回6.我可以使用什么函数来确定uint8_t数组的长度或者如何我可以修改下面的代码(osal_DataLenght()fcn)吗?

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 个答案:

答案 0 :(得分:5)

要知道数组的大小,请写(在 setNewLevel() 中表示@Dabo):

sizeof(msg)/sizeof(uint8_t);

strlen()返回字符串的大小(由NULL终止的char数组,即'\0')。你不能在这种情况下使用它,因为:

  1. msg[2]msg[5]值未初始化
  2. msg不是由char终止的NULL序列。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

strlen(const char *str)

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

答案 3 :(得分:-1)

也许你可以像这样使用它。首先,您可以使用 memset 将所有元素数组设置为 ZERO“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) );
    }