[英]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.