Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么可以';在C++;? 我在C++中做了一个TigToToTi游戏,在观看编码训练之后,使用JavaScript在他的视频中进行。我不是新手,但我是C++新手。_C++_Arrays_C++11_Multidimensional Array_Char - Fatal编程技术网

为什么可以';在C++;? 我在C++中做了一个TigToToTi游戏,在观看编码训练之后,使用JavaScript在他的视频中进行。我不是新手,但我是C++新手。

为什么可以';在C++;? 我在C++中做了一个TigToToTi游戏,在观看编码训练之后,使用JavaScript在他的视频中进行。我不是新手,但我是C++新手。,c++,arrays,c++11,multidimensional-array,char,C++,Arrays,C++11,Multidimensional Array,Char,当我试图更改2D char变量时,出现了问题 #include <iostream> #include <string> #include <vector> constexpr unsigned int board_x = 3, board_y = 3; const std::string divider = "--------------------------------------------------"; char board

当我试图更改2D char变量时,出现了问题

#include <iostream>
#include <string>
#include <vector>

constexpr unsigned int board_x = 3, board_y = 3;
const std::string divider = "--------------------------------------------------";

char board[board_x][board_y]
{
    {'-', '-', '-'},
    {'-', '-', '-'},
    {'-', '-', '-'}
};

std::vector<std::string> available_locations{ "A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3" };

bool is_location_valid(const std::string&);
void change_board(std::string, unsigned short);
void print_available_locations();
void print_board();
void switch_turn(unsigned short&);
void take_turn(unsigned short&, std::string&);

int main()
{
    unsigned short player_turn = 1;
    std::string user_input;

    print_available_locations();
    take_turn(player_turn, user_input);
}

bool is_location_valid(const std::string& input)
{
    for (std::string& available_location : available_locations)
    {
        if (available_location == input) return true;
    }

    std::cout << "Unknown location" << std::endl << std::endl;
    return false;
}

void change_board(std::string input, const unsigned short player_turn)
{
    if (input.find('A') == 0) input[0] = '1';
    else if (input.find('B') == 0) input[0] = '2';
    else if (input.find('C') == 0) input[0] = '3';

    board[static_cast<int>(input[0]) - 1][static_cast<int>(input[1]) - 1] = player_turn == 1 ? 'X' : 'O';
}

void print_available_locations()
{
    std::cout << "Available location: ";
    for (unsigned int i = 0; i < available_locations.size(); i++)
    {
        if (i != available_locations.size() - 1) std::cout << available_locations[i] << ", ";
        else std::cout << available_locations[i] << ".\n";
    }
}

void print_board()
{
    for (char(&i)[3] : board)
    {
        for (char j : i)
        {
            std::cout << j << "\t";
        }

        std::cout << std::endl;
    }
}

void switch_turn(unsigned short& player_turn)
{
    switch (player_turn)
    {
        case 1:
            player_turn = 2;
            break;
        case 2:
            player_turn = 1;
            break;
        default:
            player_turn = 1;
            break;
    }
}

void take_turn(unsigned short& player_turn, std::string& user_input)
{
    do
    {
        std::cout << "Player " << player_turn << ", enter board location...\n";
        std::getline(std::cin, user_input);
    } while (!is_location_valid(user_input));

    change_board(user_input, player_turn);
    print_board();
    std::cout << divider << std::endl;
    switch_turn(player_turn);
}
#包括
#包括
#包括
constexpr unsigned int board_x=3,board_y=3;
常量std::字符串分隔符=“-------------------------------------------------------------”;
字符板[board_x][board_y]
{
{'-', '-', '-'},
{'-', '-', '-'},
{'-', '-', '-'}
};
std::矢量可用位置{“A1”、“A2”、“A3”、“B1”、“B2”、“B3”、“C1”、“C2”、“C3”};
bool是有效的(const std::string&);
无效更改板(标准::字符串,无符号短);
无效打印可用位置();
无效打印板();
无效开关U形转弯(无符号短路&);
void take_turn(无符号的短字符串&,标准::字符串&);
int main()
{
未签名的短线球员\u回合=1;
std::字符串用户输入;
打印可用位置();
轮流(玩家轮流,用户输入);
}
bool是有效的(const std::string&input)
{
用于(标准::字符串和可用位置:可用位置)
{
if(available_location==input)返回true;
}

std::cout您似乎假设
static_cast('1')
为1。事实并非如此。字符由整数值编码,无论系统使用何种编码,用于表示字符“1”的值都不是1

在无处不在的ASCII编码中,“1”由值49表示。索引49-1即48远远超出了数组的边界

一个可能的解决方案:

input[0] = 1
替代解决方案:

board[input[0] - '1']

这些修复是排他性的。

您似乎假定
static_cast('1')
为1。事实并非如此。字符是由整数值编码的,无论系统使用何种编码,用于表示字符“1”的值都不是1

在无处不在的ASCII编码中,“1”由值49表示。索引49-1即48远远超出了数组的边界

一个可能的解决方案:

input[0] = 1
替代解决方案:

board[input[0] - '1']
这些修复是排他性的。

Try(输入[0]-“1”)而不是(静态_转换(输入[0])-1)Try(输入[0]-“1”)而不是(静态_转换(输入[0])-1)