我试图在c中找到char数组的大小。中间有零,因此strlen
没有给出正确的答案。下面是一个示例场景。
char buffData[256];
buffData[0] = 0x89;
buffData[1] = 0x32;
buffData[2] = 0x00;
buffData[3] = 0x02;
buffData[4] = 0x01;
如何找到合适的长度。 ps:strlen会给出2这是错误的
我想要答案5!
答案 0 :(得分:2)
甚至比
更好int len = sizeof(buffData) / sizeof(char);
你可以更一般地写一下:
int len = sizeof(buffData) / sizeof(buffData[0]);
如果您(或其他人)更改buffData
的声明,它仍然有用,例如:
double buffData[256];
如果您想知道某个时刻阵列中实际有多少元素,则至少有两个选项:
跟踪元素计数,每次插入元素增量计数器,减少元素删除
char buffData[256];
int buffData_n = 0;
buffData[0] = 0x32;
buffData_n++;
将memset内存归零或对其进行零初始化,这样就可以明确地计算非零元素:
int i = 0;
for ( ; i < 256 && buffData[i]; i++);
printf("There is %d elements in the array now\n", i);
如果要允许填充0的间隙,并且可以指定间隙的大小:
int n = 0, i = 0;
// gap size 2 max
for ( ; i < 255; i++)
{
if (buffData[i]==0 && buffData[i+1]==0) break;
if (buffData[i]) n++;
}
printf("There is %d elements in the array now\n", n);
答案 1 :(得分:1)
您是否要求数组的确切大小? 在这种情况下,您可以使用以下内容:
int len = sizeof(buffData) / sizeof(char); //always 1 anyway
请注意,如果将buffData作为指针传递给函数,则无效。
答案 2 :(得分:0)
如果你不在某个地方存放大小,就不能这样做。
否则某些功能会如何知道它到达终点?
对于您的示例,我们之前说数组已归零;
看起来像是:
buffData[0] == 0x89;
buffData[1] == 0x32;
buffData[2] == 0x00;
buffData[3] == 0x02;
buffData[4] == 0x01;
buffData[5] == 0x00;
buffData[6] == 0x00;
...
buffData[255] == 0x00;
//out of buffer here
buffData[256] == 0x040; // arbitrary values since the memory is not
buffData[257] == 0x042; // allocated or allocated to another variable
怎么会有人知道它应该停在索引4而不是6,2,257或任何其他数字?只有你知道。
现在让我们再拍一些代码:
char buffData[256];
buffData[0] = 0x89;
buffData[1] = 0x32;
你期待回答,但在记忆中看起来像:
buffData[0] == 0x89;
buffData[1] == 0x32;
buffData[2] == 0x00; // arbitrary values since not initialized
buffData[3] == 0x02;
buffData[4] == 0x01;
内存可能看起来完全一样,但你期待不同的输出。这是一种不确定的行为。
你应该添加一些假设,比如没有预先归零的数组,计数器或某种标记的尾随零。
但是,可以使用sizeof
来确定您案例中的数组长度。
如果用malloc
定义,则无法知道sizeof将返回指针的大小。
答案 3 :(得分:0)
在C11和C99标准中,char数组表示的字符串必须以null结尾。因此,如果中间有0,则无法知道结束的位置,因为c中字符串结尾的唯一标准定义是终止0.将长度存储在某处或确保没有0。
答案 4 :(得分:0)
你可以检查最后一个元素之后的下一个元素(在'\ 0'之后),看看你是否在那里找到了一些东西,如下所示:
#include<stdio.h>
size_t size(char *s){
size_t len = 0;
while (s[len] != '\0'){
len++;
}
while (s[len+1] != '\0'){
len++;
}
return len;
}
int main(void){
char buffData[256] = "ABC\0DE";
size_t len = size(buffData);
printf("The size is %zu\n",len);
return 0;
}
输出:
大小为5
无论如何,这只是理论。