C++中使用常量字符串初始化矩阵输出异常该如何解决?
代码问题原因
- 核心类型不匹配:你声明的
Board[3][3]是char*(字符指针)类型的二维数组,存储的是字符串的内存地址,而非单个char字符。在displayBoard中你用%c格式符输出时,printf会将传入的指针地址的低8位当做ASCII值解析,你当前运行环境下"@"字符串的地址低8位刚好对应'f'的ASCII值(0x66),因此输出全为f。 - 类型转换不合法:C中字符串字面值(如
"@"、"X")属于const char*类型,直接赋值给非const的char*属于违规类型转换,高版本C标准下会直接编译报错,属于未定义行为。 - 冗余无效代码:你写的多个
printf("\n---|---|---\n", Board[0][0], Board[0][1], Board[0][2]);中,格式化字符串没有对应占位符,后面三个参数完全无效,属于冗余内容。
修复后的基础实现
直接将二维数组改为存储char类型的单个字符即可,符合你的使用需求:
#include <iostream> using namespace std; // 改为char类型的二维数组,存储单个字符 char Board[3][3]; const char PLAYER = 'X'; const char COMPUTER = 'O'; const char INIT_CHAR = '@'; void displayBoard() { printf(" %c | %c | %c ", Board[0][0], Board[0][1], Board[0][2]); printf("\n---|---|---\n"); printf(" %c | %c | %c ", Board[1][0], Board[1][1], Board[1][2]); printf("\n---|---|---\n"); printf(" %c | %c | %c ", Board[2][0], Board[2][1], Board[2][2]); printf("\n---|---|---\n"); } void FillBoard() { for (int i=0; i<3; i++) { for (int j=0; j<3; j++) { Board[i][j] = INIT_CHAR; } } } int main () { FillBoard(); displayBoard(); return 0; }
更推荐的C++风格实现
使用标准库容器std::array替代原生数组,安全性更高,也支持直接批量初始化:
#include <iostream> #include <array> using namespace std; constexpr int BOARD_SIZE = 3; constexpr char PLAYER = 'X'; constexpr char COMPUTER = 'O'; constexpr char INIT_CHAR = '@'; // 使用std::array管理二维数组,越界访问有检查、生命周期自动管理 array<array<char, BOARD_SIZE>, BOARD_SIZE> Board; void displayBoard() { for (int i = 0; i < BOARD_SIZE; ++i) { cout << " " << Board[i][0] << " | " << Board[i][1] << " | " << Board[i][2] << endl; if (i != BOARD_SIZE - 1) { cout << "---|---|---" << endl; } } } void FillBoard() { // 批量初始化,无需嵌套循环写法更简洁 for (auto& row : Board) { row.fill(INIT_CHAR); } } int main () { FillBoard(); displayBoard(); return 0; }
内容的提问来源于stack exchange,提问作者solid
相关产品推荐
相关产品推荐

