我写了以下函数:
typedef enum {GREEN,BLACK, WHITE} color;
void StartGame(Piece board[8][8])
{
color currentPlayer=WHITE;
char location[2];
int gameover=1;
while(gameover)
{
printf("%d\n",currentPlayer);
if(currentPlayer==WHITE)
printf(BOLDWHITE"White: Please select a piece:\n");
else
printf(BOLDBLACK"Black: Please select a piece:\n");
printf("%d\n",currentPlayer);
scanf("%s",location);
printf("%d\n",currentPlayer);
if(currentPlayer==WHITE)
currentPlayer=BLACK;
else
currentPlayer=WHITE;
}
}
我在任何级别打印currentPlayer
以查看正在进行的操作 - >在这里我得到了:
2
White: Please select a piece:
2
a1
0
2
White: Please select a piece:
2
为什么scanf
之后当前玩家为0?我没碰过它。
答案 0 :(得分:4)
缓冲区location
只有2个字符的空间,而scanf
会在结尾添加额外的NUL字符。因此,您有堆栈损坏问题。只需为location
留出更多空间,例如:
char location[8];
修改强>
由于您只想阅读字符串,我建议您使用fgets
,它允许您限制输入字符串中的读取字符数。因此,我的代码看起来像这样:
char location[8];
...
fgets(location, sizeof(location), stdin); //instead of scanf, fgets reads at most one less than buffer's size characters.
你只需要担心fgets
在最后放置一个最终的终结字符(\n
)这一事实,但如果你只是处理2个第一个字符,那么这不应该是一个交易。字符串。
答案 1 :(得分:0)
在字符数组位置输入字符串时,似乎覆盖了currentPlayer占用的内存。正如从控制台输出中看到的那样,您输入了字符串a1
。要将它存储在数组位置,它应该以leat定义为
char location[3];
因为scanf会在输入的字符串后附加终止零。
如果你改用函数fgets
会更好。
答案 2 :(得分:0)
您应该使用类似这样的内容:
sprintf(format, "%%%dX", sizeof(buffer));
fscanf(file, format, &buffer);