unsigned char表的长度

时间:2015-05-13 17:34:24

标签: c string

我声明了一个unsigned char表,如下所示:

unsigned char buf[10]={'1','5',0x00,'8'};

为了知道这个表的元素数我实现了这个功能

int tablength(unsigned char *buf)
{
int i=0;
for (i=0;buf[i];i++)
    ;
return i;
}

但是当缓冲区中间包含0时,这个函数没有给我正确的结果.Sizeof没有给我正确的结果,因为在这种情况下它返回10我不能使用strlen,因为这是一个无符号字符表。 你有任何想法改进这个功能或任何预定义的功能,帮助我解决我的问题(我等待的结果是4)

6 个答案:

答案 0 :(得分:1)

从技术上讲,由于您声明了一个静态分配的10个元素数组,因此数组的大小为10.即使您可能没有初始化每个元素,也会填充该空间。 C ++无法确定数组中的值是否意味着什么。

答案 1 :(得分:1)

unsigned char x[10] = {1, 2, 3};

变量x(数组)有10个元素,前三个初始化为1,2和3,所有其他元素初始化为0.换句话说,该定义与

完全相同
unsigned char x[10] = {1, 2, 3, 0, 0, 0, 0, 0, 0, 0};

C和C ++中的数组只是一个固定的内存区域,并不包含多少"有趣的"元素在那里。

如果您正在寻找具有可变数量元素的容器,请考虑std::vector(仅限C ++)。使用std::vector::size()返回容器中当前的元素数。

答案 2 :(得分:1)

如果您需要数组包含您已指定的元素数量,只需声明它没有特定大小:

unsigned char buf[]={'1','5',0x00,'8'};
cout << sizeof(buf); // should be 4

如果要存储可变数量的数据(使用C ++),请使用std::vector而不是数组。

否则,您需要自己跟踪有效元素的数量。语言中没有任何内容可以帮助你。

答案 3 :(得分:1)

编译器无法知道您希望如何使用数组实例。 因此,您必须遵循语言的语义。通过全局或本地声明您的数组,但使用存储类说明符static,您将默认情况下将每个元素初始化为0,并且您的函数将起作用。

0x00是假的。 0x00(与0x0相同)是表示0(false)的十六进制数字。这是你的计数循环将停在 - 第3个元素。

您可以做的另一件事是使用非固定大小声明您的数组。

unsigned char buf[]={'1','5',0x00,'8'};

在这种情况下,sizeof运算符按预期工作。 因为这样,你将有一个包含4个元素的数组。

strlen()显然不会工作,因为它设计用于处理字符串,而不是缓冲区。

至于一种更智能的功能:

size_t arrcnt (unsigned char source[], size_t size)
{
    size_t i;

    for(i = size; i >= 0 && !source[i]; i--);

    return i + 1;
}

用法:

printf("size of buf: %u", arrcnt(buf, sizeof(buf));

答案 4 :(得分:0)

当buf [i]包含0时,

buf [i]的计算结果为false。

除非您知道在0到UCHAR_MAX(255)之间的数组中永远不会出现的值,否则无法执行您想要的操作。假设值为255,那么在开始填充之前首先将完整数组初始化为255.

for(i = 0; buf[i] != 255, ++i)

然后填写您想要的其他元素,然后您可以使用以下

Users2Projects

答案 5 :(得分:0)

尝试放:

$('#addsys-arm-1').focusout(function(){
   var weight = $('#addsys-lbs-1').val();
   var arm = $('#addsys-arm-1').val();
   var sum = weight * arm;
   $('#addsys-moment-1').html(sum);
});