如何在中间包含零的c中查找char数组的实际结尾

时间:2015-10-20 08:17:51

标签: c

我试图在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!

5 个答案:

答案 0 :(得分:2)

甚至比

更好
int len = sizeof(buffData) / sizeof(char);

你可以更一般地写一下:

int len = sizeof(buffData) / sizeof(buffData[0]);

如果您(或其他人)更改buffData的声明,它仍然有用,例如:

double buffData[256];

如果您想知道某个时刻阵列中实际有多少元素,则至少有两个选项:

  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);
    
  3. 如果要允许填充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

无论如何,这只是理论。