在C ++上将char赋值给多维char数组时出现逻辑错误

时间:2015-06-25 17:03:37

标签: c++ multidimensional-array

我正在尝试为玩家设置一个用于放置角色的棋盘,对于这个例子,我只是使用' 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;
}

当电路板重新出现在屏幕上运行此代码后,所有字符仍然是“#”;没有任何变化。

2 个答案:

答案 0 :(得分: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 而不是|| 的原因。

而不是

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] << '|';

答案 1 :(得分:0)

而不是:

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