为何这段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)。终端输出空字符时,通常会显示为空格,这就是出现异常的根源。解决方法:
- 推荐使用标准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; } } - 若坚持使用数组,可手动遍历初始化所有元素为
'.'(仍依赖编译器对VLA的扩展支持):// 替换原初始化代码 char arr[n][m]; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { arr[i][j] = '.'; } }
- 推荐使用标准C++的
内容的提问来源于stack exchange,提问作者Razan
相关产品推荐
相关产品推荐

