簡體   English   中英

無符號字符表長度

[英]unsigned char table length

我聲明了一個未簽名的char表,如下所示:

unsigned char buf[10]={'1','5',0x00,'8'};

為了知道該表的元素數量,我實現了此功能

int tablength(unsigned char *buf)
{
int i=0;
for (i=0;buf[i];i++)
    ;
return i;
}

但是,當緩沖區中間包含0時,此函數無法給我正確的結果.sizeof不能給我正確的結果,因為在這種情況下它返回10,因此我既不能使用strlen,因為這是一個無符號表焦炭。 您是否有任何想法來改進此功能或任何可幫助我解決問題的預定義功能(我等待的結果是4)

從技術上講,由於您聲明了一個由10個元素組成的靜態分配的數組,因此數組的大小為10。即使您可能尚未初始化每個元素,但仍有一定的空間。 C ++無法確定數組中的值是否有意義。

unsigned char x[10] = {1, 2, 3};

變量x (一個數組)有10個元素,前三個元素初始化為1、2和3,所有其他元素初始化為0。換句話說,定義與

unsigned char x[10] = {1, 2, 3, 0, 0, 0, 0, 0, 0, 0};

C和C ++中的數組只是內存的固定區域,不包括存在多少“有趣”元素的計數器。

如果您正在尋找具有可變數量元素的容器,請考慮使用std::vector (僅C ++)。 使用該std::vector::size()返回容器中的當前元素數。

如果您需要數組完全包含您指定的元素數,則只需聲明其大小即可:

unsigned char buf[]={'1','5',0x00,'8'};
cout << sizeof(buf); // should be 4

如果要存儲可變數量的數據(在C ++中),請使用std::vector而不是數組。

否則,您需要自己跟蹤有效元素的數量。 語言中沒有什么可以幫您的。

編譯器不知道您想如何使用數組實例。 因此,您必須遵循該語言的語義。 通過全局或局部聲明數組,但使用存儲類說明符為static ,則默認情況下會將每個元素初始化為0,並且函數將起作用。

0x00為假。 0x00 (與0x0相同)是代表0 (假)的十六進制數。 這是您的計數循環將在第三個元素處停止的地方。


您可以做的另一件事是用非固定大小聲明數組。

unsigned char buf[]={'1','5',0x00,'8'};

在這種情況下, sizeof運算符會按預期工作。 因為這樣,您將擁有4個元素的數組。


strlen()顯然不能工作,因為它被設計用於字符串而不是緩沖區。


至於依靠智能方法的功能:

size_t arrcnt (unsigned char source[], size_t size)
{
    size_t i;

    for(i = size; i >= 0 && !source[i]; i--);

    return i + 1;
}

用法:

printf("size of buf: %u", arrcnt(buf, sizeof(buf));

當buf [i]包含0時,buf [i]的計算結果為false。

除非您知道一個永遠不會出現在0到UCHAR_MAX(255)之間的數組中的值,否則您無法做您想做的事情。 假設該值為255,然后在將其填充之前先將整個數組初始化為255。

 memset(buf, 255, sizeof(char) * sizeof(buf));

然后,您可以根據需要填充其他元素,然后可以使用以下內容

for(i = 0; buf[i] != 255, ++i)

嘗試把:

for(int i=0;buf[i]!= 0;i++)
count++;
return count;

暫無
暫無

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

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