对数组的引用,并没有按预期工作

时间:2011-03-24 09:16:42

标签: c++ arrays reference

问候,

自从我上一次关于C ++的问题以来,我实际上学到了很多东西。我现在对课程很满意,对指针和参考文献感到不太满意。

请注意,我不是要求你解决我的问题,我问为什么我没有得到希望的结果。

这里有一些代码片段可以帮助我解释这个问题: 我正在制作一个基于控制台的tic-tac-toe游戏(最近开始学习C ++,这个imo是一个很好的方法)

main.cpp中:

//Here I initalise 1 variable and an array
int move;
char board[9] = {' ',' ',' ',' ',' ',' ',' ',' ',' '};

第一个问题:是否有更好的方法在char数组中定义空格? 我这样做的原因是,我希望我的tictactoe板在X或O尚未设置时包含空格。

main.cpp中:

if(referee.validateMove(board, move))
{
   board[move] = player2.getToken();
   displayBoard(board);
}

这里发生的事情很容易理解,但无论如何我都会解释;

从对象裁判员调用validateMove方法,并传递2个参数,即玩家选择的移动(在0-8之间)。和tictactoe板。

Referee.cpp

bool Referee::validateMove(const char (&board)[9], int& move)
{
    if(board[move] != 'X' || 'O')
    {
        return true;
    } 
    else 
    {
        return false;
    }
}

这是主要问题所在,我的最后一个问题出现了。 如前所述,我传递了一个大小为9的字符数组。

对move变量的引用效果很好(我应该使用引用还是指针?)并且它包含了所希望的结果。

此时,玩家1表示移动并在第2位放置了一个令牌 我现在想把我的令牌作为第2位的玩家2

当我使用visual studio进行调试时,我得到以下内容:

0x0024faa8 "  O      ÌÌÌÌÌÌÌÌÌÌÌ"

这是我在电路板参数上按住鼠标的时候。 所以董事会知道,它已被占用。

为什么validateMove方法总是返回true,并且board [move]永远不会等于O或X?

感谢您抽出宝贵时间阅读我的问题。如果您有疑问,或者我在愚蠢的事情中解释了某些内容,您会看到无效的命名约定,请通知我。我是学生,我想尽可能多地接受。

此问题已解决。感谢那些已经回答的人。非常感谢。

2 个答案:

答案 0 :(得分:5)

你的情况归结为:

if((board[move] != 'X') || ('O'))
在这种情况下,

'O'将始终评估为true,因此您始终会通过该条件。你想要的是这个:

if((board[move] != 'X') && (board[move] != 'O'))

要验证,此代码对我来说运行良好:

#include <iostream>

bool validateMove(const char (&board)[9], int move)
{
    if((board[move] != 'X') && (board[move] != 'O'))
    {
        std::cout << "True" << std::endl;
        return true;
    } 
    else 
    {
        std::cout << "False" << std::endl;
        return false;
    }
}


int main()
{
    char board[9] = {' ',' ','O',' ','X',' ',' ',' ',' ',};

    validateMove(board, 0);
    validateMove(board, 2);
    validateMove(board, 4);
}

输出结果为:

True
False
False

答案 1 :(得分:2)

你最后显示额外垃圾的原因是你的 “board”不是一个nul终止字符串。如果你也想使用 它用于显示目的,你需要声明它[10], 并在末尾添加'\ 0'。从设计的角度来看, 但是,我建议不要这样做。事实上,我会 定义一个Board类,其中&lt;&lt;操作员显示它,这样 我可以随意更改表示,而不必 修改框架。如果在董事会内表示 class是char [9],板值是实际值 字符,然后你可以简单地将电路板记入 一个char [10],追加缺少的'\ 0',然后输出。做好准备 然而,如果你发现,后来采用更复杂的解决方案 char [3] [3]是一个更好的表示,或者它是 最好使用,比方说0,-1和1作为一个位置的状态 在板上。 (我可能有董事会负责人 确定移动的合法性。)

当我在它时:你的validateMove函数应该是:

return board[move] == 'X' || board[move] == '0';

或者甚至更简单:

return board[move] == ' ';

你正在使用'0',转换为bool,总是如此 真正。并且返回true或false的if是不必要的 并发症和混乱,并建议作者 不理解'bool'的概念,或者是故意的 试图混淆代码。