检查整个数组是否为空

时间:2014-03-02 23:48:12

标签: c++ arrays

我有一个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语句。

3 个答案:

答案 0 :(得分:1)

如果我已正确理解您,您要检查数组是否包含消息。我想该消息存储为字符串文字。您可以使用标头std::all_of

中声明的标准算法<algorithm>来执行此操作

例如

#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] = {};

答案 1 :(得分:1)

要检查维度是否为空,您需要检查维度中的每个元素。您可以使用简单的for循环来完成此任务。

但是,您发布的代码存在问题。在for for 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()等函数中,然后在程序初始化中调用该函数。

答案 2 :(得分:0)

数组的第一个维度被第二个维度占用,因此它不能等于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]))
        {
            // ....
        }
    }