【问题标题】:Logical error on assigning a char to a multidimensional char array on C++在 C++ 上将 char 分配给多维 char 数组时出现逻辑错误
【发布时间】:2015-06-25 17:03:37
【问题描述】:

我正在尝试为玩家设置一个棋盘来放置角色,在此示例中,我只使用“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;
}

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

【问题讨论】:

  • 这段代码无法编译。
  • doboard;, pickR;??更好的doboard();pickR();
  • 请习惯 C/C++ 范围:它们从零开始,以 size-1 结束(你的循环是错误的,也是矩阵的大小)
  • @RedRoboHood Yup! 投票结束。
  • 我没有添加所有代码,只是我有问题的部分。忘记括号了,我不得不从编辑器翻译并重新输入代码,因为它是另一种语言,抱歉。

标签: c++ multidimensional-array


【解决方案1】:

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

char matrix[9][9];

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

所以,matrix 是一个二维数组,具有列索引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' 将是falsematrix[i][j] != 'O' 将是true。因此,if 块将执行并将R 替换为您不期望的_。这就是为什么使用&amp;&amp; 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] << '|';

【讨论】:

  • 谢谢,但我仍然遇到与调用 doBoard(); 时相同的问题第二次,字符没有从“_”变为“R”。
  • @andross 为什么您希望doBoard 将下划线更改为“R”?您在该函数的哪个位置将任何位置设置为“R”?也许告诉我们该函数的目标,因为 if 语句看起来非常可疑。
【解决方案2】:

而不是这个:

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

【讨论】:

    猜你喜欢
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 2014-07-17
    • 2011-02-07
    相关资源
    最近更新 更多