【问题标题】:C++ boolean array initializationC++ 布尔数组初始化
【发布时间】:2016-12-27 17:46:14
【问题描述】:

我想将二维布尔数组中的所有元素初始化为 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

那么,代码有什么问题?

【问题讨论】:

  • C++ 不支持可变长度数组。对于编译器使用的任何非标准扩展,您都应该参考文档。
  • No repro 必须是未定义的行为。
  • @HumamHelfawi 这不是那个问题的骗子,因为它表现出与答案中提供的不同的行为(答案说每个没有初始化器的元素都将被值初始化——对于整数类型设置为 0)
  • 谢谢!现在我明白了。
  • 使用向量。 std::vector&lt;std::vector&lt;bool&gt;&gt; vec(n, std::vector&lt;bool&gt;(m,false));

标签: c++ arrays initialization boolean


【解决方案1】:
#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 

【讨论】:

    【解决方案2】:

    使用 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;
             }
         }
    

    【讨论】:

      【解决方案3】:

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

      C 中有一条规则规定,所有静态存储持续时间的对象,如果程序员没有显式初始化,则必须设置为零。

      静态存储持续时间是:

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

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

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

      更新:

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

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

      【讨论】:

      • memset 应该带有严重的警告。它适用于填充整数类型,但 不适用于 用于指针和浮点数。 void *p; memset(&amp;p, 0, sizeof(p)); p==nullptr; 是未定义的行为。在实践中,我知道目前没有哪个平台无法运行,但我使用过会崩溃的平台。换句话说:p=0 可能意味着“将p 设置为空指针”,但这并不意味着空指针全部为零。
      【解决方案4】:

      从字符串初始化布尔数组

      跳过这个问题,我提出了一个解决方案,其中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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-26
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 2015-01-18
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多