如何在中间包含零的c中查找char数组的实际结尾
我试图在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!
甚至比
int len = sizeof(buffData) / sizeof(char);
你可以更一般地写:
int len = sizeof(buffData) / sizeof(buffData[0]);
如果您(或其他人)更改buffData
的声明,它buffData
,例如:
double buffData[256];
如果您想知道某个时刻arrays中实际有多少元素,则至少有两个选项:
-
跟踪元素计数,每次插入元素增量计数器,减少元素删除
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);
你问的是arrays的确切大小吗? 在这种情况下,您可以使用以下内容:
int len = sizeof(buffData) / sizeof(char); //always 1 anyway
请注意,如果将buffData作为指针传递给函数,则不起作用。
在C11和C99标准中,char数组表示的字符串必须以null结尾。 因此,如果中间有0,则无法知道结束的位置,因为c中字符串结尾的唯一标准定义是终止0.将长度存储在某处或确保没有0。
您可以检查最后一个元素之后的下一个元素(在’\ 0’之后)以查看是否在那里找到了某些内容,如下所示:
#include 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
无论如何,这只是理论。
如果你不在某处存放大小,你就不能。
否则,某些function会如何知道它到达终点?
对于你的例子,假设数组之前已归零;
它看起来像:
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将返回指针的大小。