全局字符数组不会正确重新分配或输出
Global character array won't be reassigned or outputted correctly
我正在尝试制作一个非常基本的井字游戏程序,并且我将板存储在字符数组中。这个数组是全局的,所以我可以从函数中输出它,也可以在主函数中指定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()中修改它,那么你需要引用单个单元格并给它们一个值。
- 为对象分配整数.输出将是什么?
- 如果我们在其中输入一个整数,则字符会给出整数作为输出,但是当分配给它一个整数时,这不会发生。为什么?
- 将数据分配给了数组分配,但程序显示了以缓冲区超支的输出
- OpenSSL:当输出ptr为空时,BIGNUM的bin2bn不会分配新的BIGNUM
- 在标准输出中执行打印会导致数组中随机分配值
- 将功能输出分配给变量
- 获取“将返回值分配给新变量”的警告和输出是内存地址
- 动态分配的数组在输出时丢失 ifstream 数据
- 如果/else语句未显示/可变分配问题的输出;初学者程序员
- 试图分配输出以查看指针和参考输出时,请勿命名类型错误
- 动态分配的输入,并在C 中输出2D阵列
- 对数组,乱码输出(未分配的内存?
- pthread分配输出错误
- 尝试计算分配的夹克、帽子和腰围。输出"0x8049f64"而不是应答
- 如何为 zlib 的膨胀函数重新分配输出缓冲区?
- 是否可以从C++释放分配的内存输出
- 如何从函数中获取替代值,该函数通过非常量输出参数提供所需数据,以便为其分配对常量变量的引用
- 我应该释放内部分配的MFT输出缓冲区的返回IMFSample吗
- 全局字符数组不会正确重新分配或输出
- 如何分配谷歌协议缓冲区SerializeAsString()输出,其中包含嵌入空到std::string