[英]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];
如果您想知道某個時刻數組中實際有多少個元素,則至少有兩個選項:
跟蹤元素計數,每次插入元素時,計數器都會增加,元素移除時會減少
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);
您是否要求數組的確切大小? 在這種情況下,可以使用以下方法:
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.