You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段C++代码输出空格而非'.',其余元素显示正常?

#include <iostream>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0) , cin.tie(NULL) , cout.tie(NULL) ;

    int n , m , t ; cin >> n >> m >> t ;

    char arr[n][m] = {'.'} ;                           
                                                       
    while ( t-- ) {                                    
                                                      
        int r1 , r2 , c1 , c2 ; char ch ;             
        cin >> r1 >> r2 >> c1 >> c2 >> ch ;           

        r1-- ; r2-- ; c1-- ; c2-- ;  
        for ( int i = r1 ; i <= c1 ; i++ ) { 
            for ( int j = r2 ; j <= c2 ; j++ ) { 
                arr[i][j] = ch ; 
            }
        }
    }
    for ( int i = 0 ; i < n ; i++ ) {
        for ( int  j = 0 ; j < m ; j++ ) {
            cout << arr[i][j] ;
        }
        cout << endl ;
    }
}
问题背景

输入第一行包含3个整数n、m和t,随后t行每行包含4个整数r1、r2、c1、c2和一个小写拉丁字母ch。需求为将r1到r2行、c1到c2列的子网格填充为字符ch,数组其余元素为'.'。

测试用例

输入

6 6 3
1 1 2 6 a
5 1 6 6 c
2 3 5 4 b

实际输出

aaaaaa
aabbaa
  bb
  bb
ccbbcc
cccccc

期望输出

aaaaaa
aabbaa
..bb..
..bb..
ccbbcc
cccccc
疑问

为何代码本该输出'.'的位置显示为空格,其余元素输出正常?

问题原因与解决方法
  • 原因:你使用的char arr[n][m] = {'.'};是变长数组(VLA)写法,这并非C++标准特性,仅部分编译器(如GCC)作为扩展支持。更关键的是,用{'.'}初始化变长数组时,只有数组的第一个元素会被设为'.',剩余元素会被默认初始化为空字符(\0)。终端输出空字符时,通常会显示为空格,这就是出现异常的根源。

  • 解决方法:

    1. 推荐使用标准C++的vector实现动态二维数组,可直接初始化所有元素为'.':
      #include <iostream>
      #include <vector>
      using namespace std;
      int main()
      {
          ios_base::sync_with_stdio(0), cin.tie(NULL), cout.tie(NULL);
      
          int n, m, t; cin >> n >> m >> t;
      
          vector<vector<char>> arr(n, vector<char>(m, '.'));
      
          while (t--) {
              int r1, r2, c1, c2; char ch;
              cin >> r1 >> r2 >> c1 >> c2 >> ch;
      
              r1--; r2--; c1--; c2--;
              for (int i = r1; i <= c1; i++) {
                  for (int j = r2; j <= c2; j++) {
                      arr[i][j] = ch;
                  }
              }
          }
          for (int i = 0; i < n; i++) {
              for (int j = 0; j < m; j++) {
                  cout << arr[i][j];
              }
              cout << endl;
          }
      }
      
    2. 若坚持使用数组,可手动遍历初始化所有元素为'.'(仍依赖编译器对VLA的扩展支持):
      // 替换原初始化代码
      char arr[n][m];
      for (int i = 0; i < n; i++) {
          for (int j = 0; j < m; j++) {
              arr[i][j] = '.';
          }
      }
      

内容的提问来源于stack exchange,提问作者Razan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 09:34:54