在C++上将字符分配给多维字符数组时发生逻辑错误

Logical error on assigning a char to a multidimensional char array on C++

本文关键字:字符 错误 数组 C++ 分配      更新时间:2023-10-16

我正试图为玩家设置一个可以放置字符的棋盘,在这个例子中,我只使用"R"。但当玩家输入角色,程序显示棋盘时,不会发生任何变化。到目前为止,我不知道出了什么问题,我正在寻找一些线索。

我应该说,这在Python上是一件非常容易的事情,但我刚刚进入C++,学习曲线很陡峭。

这是代码:

char matrix[9][9];
void doBoard()
{
    for (int i = 1; i <= 10; i++)
    {
        for (int j = 1; j <= 10; j++)
    {
            if ((matrix[i][j] != 'R') || (matrix[i][j] != 'O'))
            {
                matrix[i][j] = '_';
                std::cout << '|' << matrix[i][j] << '|';
            }
        }
        std::cout << "n";
    }
}

void pickR()
{
    int column;
    int row;
    std::cout << "nThe columns and rows are enumerated from 1 to 10.n";
    std::cout << "Select the column and row where you would like to set your piece.n";
    std::cout << "Column (1-10): ";
    std::cin >> column;
    std::cout << "Row (1-10): ";
    std::cin >> row;
    matrix[column - 1][row - 1] = 'R';
    std::cout << matrix[column][row] << "n";
main()
{
doboard();
pickR();
doboard();
return 0;
}

运行此代码后,当板再次出现在屏幕上时,所有字符仍然是"_",没有任何变化。

我看到有一些语法错误,你可以在熟悉C++语法后消除这些错误,但你的逻辑错误是:

char matrix[9][9];

记住,C++使用零索引。

因此,matrix是一个2D数组,具有列索引0-8和行索引0-8,因此以下循环可以为您提供未定义的行为,

for (int i = 1; i <= 10; i++) {
    for (int j = 1; j <= 10; j++) {
        if ((matrix[i][j] != 'R') || (matrix[i][j] != 'O'))

所以重写它们,

for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
        if ((matrix[i][j] != 'R') || (matrix[i][j] != 'O'))

对于以下线路,

if ((matrix[i][j] != 'R') || (matrix[i][j] != 'O'))

假设matrix[i][j]包含R,则matrix[i][j] != 'R'将为false,但matrix[i][j] != 'O'将为true。因此,if块将被执行,并用_替换R,这是您所没有想到的。这就是为什么使用&&AND而不是||OR

代替

if ((matrix[i][j] != 'R') || (matrix[i][j] != 'O'))
    {
        matrix[i][j] = '_';
        std::cout << '|' << matrix[i][j] << '|';
    }

使用,

 if ((matrix[i][j] != 'R') && (matrix[i][j] != 'O'))
    {
        matrix[i][j] = '_';
    }
    std::cout << '|' << matrix[i][j] << '|';

而不是这个:

for (int j = 1; j <= 10; j++)
{
    if ((matrix[i][j] != 'R') || (matrix[i][j] != 'O'))
    {
        matrix[i][j] = '_';
        std::cout << '|' << matrix[i][j] << '|';
    }
}

这样做:

for (int j = 0; j < 9; j++) // 0 to 8, not 1 to 10
{
    if ((matrix[i][j] != 'R') && (matrix[i][j] != 'O'))
    {
        matrix[i][j] = '_';             
    }
    std::cout << '|' << matrix[i][j] << '|'; // Should be outside the if if you want to print all the matrix
}

而不是这个:

matrix[column - 1][row - 1] = 'R'; 
std::cout << matrix[column][row] << "n";

这样做:

matrix[column - 1][row - 1] = 'R';
std::cout << matrix[column-1][row-1] << "n"; // You will always print the element you changed instead of one not related at all