如何在中间包含零的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中实际有多少元素,则至少有两个选项:

  1. 跟踪元素计数,每次插入元素增量计数器,减少元素删除

     char buffData[256]; int buffData_n = 0; buffData[0] = 0x32; buffData_n++; 
  2. 将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将返回指针的大小。