簡體   English   中英

檢查整個數組是否為空

[英]Check if whole array is empty

我有一個2D數組作為消息隊列,每個消息都包含為char[]

#define BUFFER_LENGTH 64    
#define QUEUE_LENGTH 100
char MessageQueue[QUEUE_LENGTH][BUFFER_LENGTH];

我想檢查數組是否為第一維的特定值為空

for(int i = 0; i < sizeof(MessageQueue); i++)
{ 
    if(MessageQueue[i] == 0)
        MessageQueue[i][j] = ....; 
}

但是,如果它為空,則不會輸入if語句。

如果我已正確理解您,您要檢查數組是否包含消息。 我想該消息存儲為字符串文字。 您可以使用標頭<algorithm>聲明的標准算法std::all_of來完成此操作

例如

#include <iostream>
#include <algorithm>
#include <iterator>

//...

if ( std::all_of( std::begin( MessageQueue ), std::end( MessageQueue ),
                  []( const char *s ) { return ( *s == '\0' ); } ) )
{
   std::cout << "The Message queue is empty" << std::endl;
} 

考慮到最初陣列應該零初始化。 例如

char MessageQueue[QUEUE_LENGTH][BUFFER_LENGTH] = {};

要檢查維度是否為空,您需要檢查維度中的每個元素。 您可以使用簡單的for循環來完成此任務。

但是,您發布的代碼存在問題。 在循環中,你使用sizeof(MessageQueue) ,它不會返回QUEUE_LENGTH ,而是返回QUEUE_LENGTH乘以BUFFER_LENGTH ,這將導致您訪問尚未分配的內存。

以下代碼將按您的意願執行。

//Note that sizeof(MessageQueue) has been changed to QUEUE_LENGTH.
for(int i = 0; i < QUEUE_LENGTH; i++)
{
    bool isEmpty = true;
    for(int j = 0; j < BUFFER_LENGTH; j++)
    {
        if(MessageQueue[i][j] != 0)
        {
            isEmpty = false;
            break;
        };
    };
    if(isEmpty)
    {
        //DO SOME WORK.

        //Exit the for-loop
        break;
    };
};

雖然上面的代碼將檢查維度是否為空,但如果剛剛創建了數組,則不太可能。 因此,您需要在對數據執行任何操作之前將數組的每個元素設置為0。 這可以通過將以下for循環放在代碼中的某些位置來完成,這些代碼將在任何訪問數組之前運行。

for(int i = 0; i < QUEUE_LENGTH; i++)
{
    for(int j = 0; j < BUFFER_LENGTH; j++)
    {
        MessageQueue[i][j] = 0;
    };
};

我建議將這個for循環放在一個函數中,例如void InitMessageQueue() ,然后在程序的初始化中簡單地調用該函數。

數組的第一個維度被第二個維度占用,因此它不能等於0.第二個維度可能包含垃圾,因為它是未初始化的。

如果要確保數組為空,請先將其初始化:

for (int i = 0; i < QUEUE_LENGTH; i++)
    for (int j = 0; j < BUFFER_LENGTH; j++)
        MessageQueue[i][j] = 0;

然后使用輔助函數:

bool isEmpty(char * arr)
{
    bool toReturn = true;

    for (int i = 0; i < BUFFER_LENGTH && toReturn; i++)
        toReturn = toReturn && 0 == arr[i];

    return toReturn;
}

用法示例:

for (int i = 0; i < QUEUE_LENGTH; i++)
    {
        if (isEmpty(MessageQueue[i]))
        {
            // ....
        }
    }

暫無
暫無

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

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