全局字符数组不会正确重新分配或输出

Global character array won't be reassigned or outputted correctly

本文关键字:分配 输出 新分配 数组 字符 全局      更新时间:2023-10-16

我正在尝试制作一个非常基本的井字游戏程序,并且我将板存储在字符数组中。这个数组是全局的,所以我可以从函数中输出它,也可以在主函数中指定X和0的位置。我的代码如下。问题是它不能正确编译。如果我在main中重新赋值之前添加char,它会编译但不能正确运行。我的c++老师也很困惑,所以我想在这里问一下。代码:

#include <iostream>
#include "charconvert.h"
#include <ctype.h>
using namespace std;
char board[3][3] =
{
    { ' ', ' ', ' ' },
    { ' ', ' ', ' ' },
    { ' ', ' ', ' ' }
};
void boardout();
int main()
{
    int currentplayer = 1;
    char p1 = 'X';
    char p2 = 'O';
    char pactive;
    int rounds = 1;
    board[3][3] = {
        { '1', '2', '3' },
        { '4', '5', '6' },
        { '7', '8', '9' }
    };
    boardout();
    bool gameover = false;
    do
    {
        if (rounds % 2 == 0){ currentplayer = 1; }
        if (rounds % 2 != 0){ currentplayer = 2; }
        boardout();
        chartoint input;
        char playermove;
        do
        {
            cout << "Player " << currentplayer << ", what space will you go on?" << endl;
            cin >> playermove;
        } while (!isdigit(playermove));
        int space = input.convert(playermove);
        if (currentplayer == 1){ pactive = p1; }
        if (currentplayer == 2){ pactive = p2; }
        if (!(space>9) && !(space<0))
        {
            switch (space)
            {
            case 1:
                if (space == ' ')
                {
                    board[0][0] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 2:
                if (space == ' ')
                {
                    board[1][0] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 3:
                if (space == ' ')
                {
                    board[2][0] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 4:
                if (space == ' ')
                {
                    board[0][1] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 5:
                if (space == ' ')
                {
                    board[1][1] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 6:
                if (space == ' ')
                {
                    board[2][1] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 7:
                if (space == ' ')
                {
                    board[0][2] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 8:
                if (space == ' ')
                {
                    board[1][2] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            case 9:
                if (space == ' ')
                {
                    board[2][2] = pactive;
                }
                else{ cout << "That space is already used. You forfeit this turn." << endl; }
                break;
            default:
                cout << "That is an invalid space. You forfeit your turn." << endl;
            }
        }
        char yn;
        cout << "Is the game over? Enter Y for yes or N for no." << endl;
        cin >> yn;
        if (yn == 'Y' || yn == 'y'){ gameover = true; }
        rounds++;
    } while (!gameover);
    return 0;
}
void boardout()
{
    int x, y;
    x = 0;
    y = 0;
    do
    {
        do
        {
            cout << board[x][y];
            if (x != 2){ cout << " | "; }
            x++;
        } while (x <= 2);
        if (y != 2)
        {
            cout << "n---------" << endl;
        }
        x = 0;
        y++;
    } while (y <= 2);
}

charconvert.h:

#ifndef CHARCONVERT_H_INCLUDED
#define CHARCONVERT_H_INCLUDED
#include <math.h>
#include <string>
using namespace std;
class chartoint
{
public:
int convert(char);
};
int chartoint::convert(char in)
{
int out = in;
out = out - 48;
return out;
}
class strtonum
{
public:
int strconvert(string);
};
int strtonum::strconvert(string input)
{
int numdigs = input.size();
//cout << input << endl;
//cout << "int numdigs = input.size();nnumdigs = " << numdigs << endl;
int c=0;
//cout << "int c=0;" << endl;
 int number [numdigs];
//cout << "int number [10] = { };n";
/*int n=0;
do
{
    cout << "number [" << n << "] = " << number[n] << endl;
    n++;
}
while(n<11);*/
int output = 0;
char tempnumc;
int tempnumi;
//int tenminusc = 10 - c;
if(numdigs<=10)
{
    //cout << "entered if(numdigs<=10)" << endl;
    do
    {
    //cout << "c = " << c << endl;
    tempnumc = input[c];
    //cout << "temp char " << tempnumc << endl;
    tempnumi = tempnumc;
    //cout << "temp i " << tempnumi << endl;
    tempnumi = tempnumi - 48;
    //cout << "temp i " << tempnumi << endl;
    number[c] = tempnumi;
    //cout << "number 10 - c = " << number[tenminusc] << endl;
    //cout << "input[numdigs-c] = number[10-c];" << endl << "numdigs-c = " << numdigs-c << 't'<< "input[numdigs-c] = " << input[numdigs-c] << 't' << "number[10-c] = " << number[10-c] << endl;
    //cout << "output = " << output << endl;
    int idontevenknowatthispoint;
    idontevenknowatthispoint = (numdigs-c)-1;
    output = output + (number[c]*pow(10,idontevenknowatthispoint));
    //cout << "output = output + (number[10-c]*pow(10,c));" << endl;
    //cout << "pow(10,c) = " << pow(10,c) << endl;
    //cout << "(number[c]*pow(10,c) = " << number[c]*pow(10,idontevenknowatthispoint) << endl;
    c++;
    tempnumc = ' ';
    tempnumi = 0;
    }
    while(c < numdigs);
    if(numdigs==3)
    {
        output = output + 1;
    }
    if(numdigs==9)
    {
        output = output + 2;
    }
}
else
{
    output = -42;
}
return output;
}
#endif // CHARCONVERT_H_INCLUDED

您声明两次char数组"board" -一次全局(在任何函数之外),另一次在main()中。你只需要声明它一次(全局的),我会在声明行的开头加上"static"这个词(推荐的做法)。

如果你在main()中声明了"board",那么你必须把它作为一个指针传递给底层函数(如果你想改变数组,还可以使用'&'作为指向指针的指针)。这里有一个网站参考,展示了如何分配和传递一个字符串的副本给另一个函数(被调用的函数不能改变字符串):https://www.cs.bu.edu/teaching/cpp/string/array-vs-ptr/和http://web.cs.swarthmore.edu/纽霍尔/unixhelp C_arrays.html

如果你需要更多的帮助,可以离线找我。汤姆杜兰tmdurand@gci.net

不能像

这样重新分配数组
board[3][3] = {
    { '1', '2', '3' },
    { '4', '5', '6' },
    { '7', '8', '9' }
};

由于在main()中尝试赋值之前从未使用过board,因此只需替换

char board[3][3] =
{
    { ' ', ' ', ' ' },
    { ' ', ' ', ' ' },
    { ' ', ' ', ' ' }
};

char board[3][3] = 
{
    { '1', '2', '3' },
    { '4', '5', '6' },
    { '7', '8', '9' }
};

如果你不想在程序开始时用数字填充全局数组,那么你需要用你想要的值设置每个单独的数组元素。你可以用几个for循环来完成:

for (int i = 0, spot = 1; i < 3; i++)
{
    for (int j = 0; j < 3; j++)
    {
        board[i][j] = spot + '0';
        spot++;
    }
}

不能在main函数中重新初始化board数组。只有在声明初始化器时才能使用它。它可能也应该被声明为静态的。如果你想在main()中修改它,那么你需要引用单个单元格并给它们一个值。