重复'\ 0'的数组长度,不是strlen

时间:2017-05-14 06:44:43

标签: c strlen

如果我需要找出重复'\ 0'字符的数组长度,我该怎么办? strlen将无法使用,因为它只会以'\ 0'停止。在那种情况下,什么是最好的解决方案? 例如,我有一个buf; 现在我不知道长度。我需要找出长度,以便我可以读取其中的整个数据。

修改

unsigned char buf [4096];

此buf中包含'\ 0'字符。但它发生在数据之间。我需要读取数据,即使是'\ 0'字符。 strlen不会解决目的。那是什么方式? 这是部分问题:lzss decoding EOF character issue

代码在那里。请看一下。

1 个答案:

答案 0 :(得分:0)

我有三种可能性来确定阵列大小:

  1. 数组声明为数组。可以使用sizeof运算符。 (很好,它的解析时间已经解决了。)

  2. 数组作为指针传递。尺寸无法根据类型确定。它必须以另一种方式提供。

  3. 数组长度可由其内容确定。这用于C字符串,但也可用于其他类型。 (考虑一下,结束标记本身会消耗一个元素。因此,最大长度比容量小一个。)

  4. 示例代码test-array-size.c

    #include <stdio.h>
    
    /* an array */
    static int a[5] = { 0, 0, 0, 0, -1 };
    
    /* a function */
    void func(int a1[], int len1, int *a2)
    {
      /* size of a1 is passed as len1 */
      printf("a1 has %d elements.\n", len1);
      /* len of a2 is determined with end marker */
      int len2;
      for (len2 = 0; a2[len2] >= 0; ++len2);
      printf("a2 has (at least) %d elements.\n", len2 + 1);
    }
    
    /* HOW IT DOES NOT WORK: */
    void badFunc(int a3[5])
    {
      int len = sizeof a3 / sizeof a3[0]; /* number of elements */
      printf("a3 seems to have %d elements.\n", len);
    }
    
    /* the main function */
    int main()
    {
      /* length of a can be determined by sizeof */
      int size = sizeof a; /* size in bytes */
      int len = sizeof a / sizeof a[0]; /* number of elements */
      printf("a has %d elements (consuming %d bytes).\n", len, size);
      /* Because this is compile-time computable it can be even used for
       * constants:
       */
      enum { Len = sizeof a / sizeof a[0] };
      func(a, Len, a);
      badFunc(a);
      /* done */
      return 0;
    }
    

    示例会话:

    $ gcc -std=c11 -o test-array-size test-array-size.c 
    test-array-size.c: In function 'badFunc':
    test-array-size.c:19:20: warning: 'sizeof' on array function parameter 'a3' will return size of 'int *' [-Wsizeof-array-argument]
       int len = sizeof a3 / sizeof a3[0]; /* number of elements */
                        ^
    test-array-size.c:17:18: note: declared here
     void badFunc(int a3[5])
                      ^
    
    $ ./test-array-size.exe 
    a has 5 elements (consuming 20 bytes).
    a1 has 5 elements.
    a2 has (at least) 5 elements.
    a3 seems to have 1 elements.
    
    $