【问题标题】:How to determine array length of uint8_t?如何确定 uint8_t 的数组长度?
【发布时间】:2015-06-22 18:20:33
【问题描述】:

我正在尝试在下面的代码中确定 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;
}

【问题讨论】:

  • 我暂时不需要msg[7],如果必须用它来查找长度,我可以取消注释
  • msg的长度 8,无论是否初始化所有元素。

标签: c arrays strlen uint8t


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    sizeof(msg)/sizeof(uint8_t);
    

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

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

    【讨论】:

    • 我想知道数组的长度,而不是数组的大小
    • C 中没有这样的东西。
    • @sven:你是什么意思?这个比率给出了数组的长度(如 Javascript 中的 .length)。
    • Amessihel,我不懂 Javascript,但我想类似的东西就是我想要的。但是,我想知道是否可以这样做,即使中间元素是 '\0'
    • @sven 所以使用 sizeof 解决方案,但只能在定义数组的块中。否则定义一个 struct 和一个 size_t 成员来存储大小。
    【解决方案3】:
    strlen(const char *str)
    

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

    【讨论】:

    • 是否需要对数组的第2、3、4、5个元素任意赋值才能检测到上面代码中数组的长度为7?
    【解决方案4】:

    也许你可以这样使用它。首先,您可以使用 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) );
        }
    

    【讨论】:

    • uint8_t msg[8] = {'\0'}; 将第一个元素设置为'\0',将其余元素设置为0,因此memset() 是多余的。
    猜你喜欢
    • 2017-11-10
    • 2017-10-18
    • 2013-05-22
    • 2011-03-24
    • 1970-01-01
    • 2011-03-17
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多