我声明了一个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)
答案 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]的计算结果为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);
});