C ++布尔数组初始化

时间:2016-08-20 19:50:02

标签: c++ arrays initialization boolean

我想将我的2维布尔数组中的所有元素初始化为false。

size_t n, m;
cin >> n >> m;
bool arr[n][m] = {false};
for(size_t i = 0; i < n; i++){
    for(size_t j = 0; j < m; j++){
        cout << arr[i][j] << " ";
    }
    cout << endl;
}

但我对输出感到非常困惑。例如,如果n = 5且m = 5,我有以下内容:

0 27 64 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

那么,代码有什么问题?

4 个答案:

答案 0 :(得分:5)

#include <iostream>

template<int N>
void print(bool x[N][N] )
{
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N;j++)
            std::cout << x[i][j] << " ";
        std::cout << "\n";
    }
    std::cout << "\n\n";
};

int main()
{
    bool a[10][10];
    bool b[10][10]{};


    print(a);
    print(b);

  return 0;
}

打印:

./main 
120 29 96 0 0 0 0 0 131 10 
64 0 0 0 0 0 168 161 188 139 
4 127 0 0 255 255 0 0 1 0 
0 0 0 176 40 152 253 127 0 0 
153 10 64 0 0 0 0 0 2 0 
0 0 0 0 0 0 221 11 64 0 
0 0 0 0 65 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
144 11 64 0 0 0 0 0 160 8 
64 0 0 0 0 0 32 177 40 152 


0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 

答案 1 :(得分:1)

使用for结构初始化值,与打印方式完全相同

     bool arr[n][m]; 
     for(size_t i = 0; i < n; i++){
         for(size_t j = 0; j < m; j++){
             arr[i][j]=false;
         }
     }

答案 2 :(得分:0)

第一件事:您的代码在我的gcc编译器中运行。我不知道你为什么会弄错。

  

C中有一条规则,即所有未由程序员明确初始化的静态存储持续时间的对象必须设置为零。

静态存储持续时间在意义上是:

  

具有静态存储持续时间的对象在整个程序执行期间驻留在相同的内存地址中。

因此,假设声明arr [n] [m] = { - 1}默认情况下只将第一个元素设置为“-1”而其他元素设置为零。然后还有糟糕的编程风格来设置arr [n] [m] = 0。

更好的选择是使用cstring的函数memsetmemset(arr ,samp, sizeof(arr[0][0]) * m * n);将arr初始化为samp。 在你的情况下,samp = 0。

<强>更新

正如Martin所说,最好不要将memset与多维数组一起使用。另一种方法是使用std:fillstd::fill(arr[0], arr[0] + m * n, samp);

这可能在C中是不可能的,但在C ++中是可能的。

答案 3 :(得分:0)

从字符串初始化布尔数组

解决这个问题,我提出了一个解决方案,其中boolean array可以由string初始化。从而'0'=false'1'=true' '=just a spacer。这项工作类似于bitset constructor

代码

#include <iostream>

/**
 * Fills boolean array based on a simple string
 *
 * @param[out] boolean array to be filled
 * @param[in] str accepts only 0 (false), 1 (true) and space (seperator) chars in string
 * @param[in] nMax maximum number of elements to write, -1 is infinite
 * @returns number of writen boolen elements
 */
size_t boolArray_from_string(bool *boolArray, const std::string str, const int nMax = -1)
{
    size_t size = str.size();
    size_t n = 0;
    int cc;
    for (cc = 0; cc < size; cc++)
    {
        if (str.at(cc) == ' ') {continue;}
        if (str.at(cc) != '0' && str.at(cc) != '1') 
        {
            throw std::invalid_argument("str must contain only 0s, 1s and spaces.");
        }
        if (n == nMax)
        {
            throw std::invalid_argument("nMax too small for str content.");
        }

        if (str.at(cc) == '0')
        {
            boolArray[n] = false;
        }
        else
        {
            boolArray[n] = true;
        }
        n++;
    }
    return cc;
}

void print(bool *x, int nRows, int nCols)
{
    for(int row=0; row<nRows; row++)
    {
        for(int col=0; col<nCols; col++)
        {
            std::cout << x[row * nCols + col] << " ";
        }
        std::cout << "\n";
    }
    std::cout << "\n\n";
};

int main()
{
    bool falseArr[3][5];
    boolArray_from_string(&falseArr[0][0], std::string(15, '0'), -1);
    print(&falseArr[0][0], 3, 5);

    bool custArr[3][5];
    boolArray_from_string(&custArr[0][0], "01011 00111 11111", -1);
    print(&custArr[0][0], 3, 5);
}

输出

0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 


0 1 0 1 1 
0 0 1 1 1 
1 1 1 1 1