【问题标题】:C++ Program, Issue converting integer input to charC++ 程序,将整数输入转换为字符的问题
【发布时间】:2018-05-16 06:39:35
【问题描述】:

我目前正在制作一个超简单的 tictactoe 程序,但遇到了一个小问题。我使用二维字符数组创建了一个游戏板(不是为此使用字符的疯狂粉丝,但认为这是使我能够将 X 和 O 输入到数组中以在屏幕上输出的最简单方法)。

在 PlayerOneMove() 函数中,我提示用户输入他想要放置游戏块的单元格 (1-9)。输入存储为字符。然后我将他的单元格选择传递给 MakeMove() 函数,该函数检查用户输入的字符当前是否存储在数组中。但是,该函数始终返回 false。

我意识到这是编译器将输入视为整数而不匹配数组中的字符的问题(因为如果我用字母替换数组中的元素然后输入一个字母它会找到匹配项) ,但我不确定如何解决这个问题。我尝试将 ASCII 值添加到字符并将 char 输入更改为整数输入,然后将其静态转换为 char 无济于事。在我决定完全消灭字符数组之前,任何帮助都将不胜感激!

class TicTacToe {
    private: 
    char board[3][3] =
        {
            {'1','2','3'},
            {'4','5','6'},
            {'7','8','9'}
        };
    public:
    void DrawBoard();
    void PlayerOneMove();
    bool MakePlay(char, char);
};

void TicTacToe::PlayerOneMove() {
    char cell;
    cout << "Player One, please select a cell: ";
    cin >> cell;

    while (!MakePlay(cell, 'O')) {
        cout << "That cell is unavailable. Please select another cell: ";
        cin >> cell;
    }
}

bool TicTacToe::MakePlay(char cell, char player) {
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            if (board[row][col] == cell) {
                board[row][col] = player;
                return true;
            }
            else return false;
        }
    }
}

int main() {
    TicTacToe game;
    game.DrawBoard();
    game.PlayerOneMove();

    return 0;
}

示例:https://imgur.com/a/1XZK6Wa

【问题讨论】:

  • 我无法重现您的问题。 minimal reproducible example 请包括您提供的输入和输出。
  • 当我运行程序并在提示输入单元格时输入任何数字 1-9 时,程序告诉我该单元格不可用(它返回 false 表示在数组中找到输入 1-9 )。我意识到 char '9' 与整数 9 不同,并认为这是问题所在,但我不确定如何将用户输入 (1-9) 转换为 '1' - '9' 所以函数将找到匹配项。
  • std::cin 不返回int
  • 要回答您的问题,您可以使用 ascii 表查看如何转换 chars/ints。 asciitable.com 例如,char '0' 是 ascii 48。所以对于 char c,一个常见的技巧是:int x = c - 48。这仅适用于 ascii,对于 unicode 或其他字符集,它会得到更多复杂。

标签: c++ arrays char static-cast


【解决方案1】:

MakePlay 中有一个逻辑错误。

当您进入嵌套的 for 循环时,它将检查输入是否与第一个单元格匹配,如果不匹配,则返回 false。其余单元格将永远不会被检查。

你要做的是检查所有单元格,如果它不匹配任何一个,则返回 false。

你可以这样重写:

bool TicTacToe::MakePlay(char cell, char player) {
    bool found_cell = false;
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            if (board[row][col] == cell) {
                board[row][col] = player;
                found_cell = true;
            }
        }
    }
    return found_cell;
}

【讨论】:

  • 非常感谢,这就是问题所在!我非常确信这是一个转换问题(因为我只测试了第一个单元格),以至于我什至没有意识到我的 return 语句位于错误的位置。
猜你喜欢
  • 2015-03-15
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多