我有一个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
语句。
答案 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]))
{
// ....
}
}