簡體   English   中英

如何在中間包含零的c中查找char數組的實際結尾

[英]how to find actual end of char array in c containing zeros in the middle

我試圖在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];

如果您想知道某個時刻數組中實際有多少個元素,則至少有兩個選項:

  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);

您是否要求數組的確切大小? 在這種情況下,可以使用以下方法:

int len = sizeof(buffData) / sizeof(char); //always 1 anyway

請注意,如果將buffData作為指針傳遞給函數,則此方法將無效。

如果不將尺寸存儲在某處,則無法進行。

否則,某些功能將如何知道它到達終點?

對於您的示例,假設數組之前為零;

它看起來像:

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將返回指針的大小。

在C11和C99標准中,由char數組表示的字符串必須以null結尾。 因此,無法知道兩個之間是否存在0,因為c中字符串結尾的唯一標准定義是終止0。將長度存儲在某個地方或確保沒有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

無論如何,這只是理論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM