C++ 检查整个数组是否为空
我有一个2D数组,用作消息队列,每条消息都包含一个C++ 检查整个数组是否为空,c++,arrays,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) Mes
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] = ....;
}
for(int i=0;i
但是,如果数组为空,则不会输入
if
语句。数组的第一个维度被第二个维度占用,因此它不能等于0。第二个维度可能包含垃圾,因为它未初始化
如果要确保数组为空,请首先初始化它:
for (int i = 0; i < QUEUE_LENGTH; i++)
for (int j = 0; j < BUFFER_LENGTH; j++)
MessageQueue[i][j] = 0;
for(int i=0;i
然后使用辅助函数:
bool isEmpty(char * arr)
{
bool toReturn = true;
for (int i = 0; i < BUFFER_LENGTH && toReturn; i++)
toReturn = toReturn && 0 == arr[i];
return toReturn;
}
bool isEmpty(char*arr)
{
bool-toReturn=true;
对于(int i=0;i
用法示例:
for (int i = 0; i < QUEUE_LENGTH; i++)
{
if (isEmpty(MessageQueue[i]))
{
// ....
}
}
for(int i=0;i
如果我正确理解了您的意思,您希望检查数组是否包含消息。我假设该消息存储为字符串文本。您可以通过使用头
中声明的标准算法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循环来实现这一点 但是,您发布的代码有一个问题。在for循环中,您使用
sizeof(MessageQueue)
,它不会返回QUEUE\u LENGTH
,而是QUEUE\u LENGTH
乘以BUFFER\u 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;
};
};
//注意sizeof(MessageQueue)已更改为QUEUE\u LENGTH。
对于(int i=0;i
虽然上面的代码将检查维度是否为空,但如果数组刚刚创建,则不太可能为空。因此,在对数组进行任何操作之前,您需要将数组的每个元素都设置为0。这可以通过将以下for循环放置在代码中的某个位置来完成,该循环将在任何东西访问数组之前运行
for(int i = 0; i < QUEUE_LENGTH; i++)
{
for(int j = 0; j < BUFFER_LENGTH; j++)
{
MessageQueue[i][j] = 0;
};
};
for(int i=0;i
我建议将这个for循环放在一个函数中,比如
void InitMessageQueue()
,然后在程序初始化时调用该函数。定义“empty”?不管你喜欢与否,这个东西占用了QUEUE\u LENGTH*BUFFER\u LENGTH
chars,而且MessageQueue[i]
将永远不会被声明为0
。而且sizeof(MessageQueue)
绝对不是您希望用于循环顶端的值。第一个维度的值不会是0。曾经您已将其定义为另一个数组,因此是2D。您需要检查整个维度是否为0(例如,在循环中,检查MessageQueue[i][0]
到MessageQueue[i][BUFFER\u LENGTH-1]
都是0。所谓空,是指第二维数组中没有值。因此,我必须使用嵌套循环检查数组中的每个元素?这是一句“数组的第一维被指向第二维的指针占用”的语句是错误的。数组中没有指针。没关系。数组不存储任何地址。数组只是内存库的一部分,这正是我要找的。我接受了答案。