Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查整个数组是否为空_C++_Arrays - Fatal编程技术网

C++ 检查整个数组是否为空

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

我有一个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] = ....; 
}
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。所谓空,是指第二维数组中没有值。因此,我必须使用嵌套循环检查数组中的每个元素?这是一句“数组的第一维被指向第二维的指针占用”的语句是错误的。数组中没有指针。没关系。数组不存储任何地址。数组只是内存库的一部分,这正是我要找的。我接受了答案。