问题描述
我有下一个错误代码 -“运行时检查失败 #2 - 变量'action'周围的堆栈已损坏。”
bool playerTurn(char board[][22],char boardcover[][22],int rows,int cols)
{
char action[1];
int row,col,count = 0;
printf("please enter your move,row and column: ");
scanf("%d%d",&row,&col);
scanf("%s",action);
if (action[0] == 'F') {
boardcover[row][col] = 'F';
}
if (action[0] == 'O') {
boardcover[row][col] = board[row][col];
revealCell(board,boardcover,rows,cols,row,col);
}
return false;
}
可能是什么问题?
我尝试初始化“动作”并仅扫描字符,但一切都不是正确的解决方案,我仍然遇到异常。
解决方法
“运行时检查失败 #2 - 变量‘action’周围的堆栈已损坏。”通常发生在缓冲区溢出之后。
首先:char action[1]
:这个变量可以容纳最大长度为 0 的字符串,是的,你已经读得很好。在 C 中,字符串以 NUL 终止(详细信息在初学者的 C 教科书中处理字符串的章节中)。因此,如果您输入任何长度超过 0 个字符的字符串,action
缓冲区会溢出,因此会出现错误消息。
第二:使用 scanf("%s",action)
不会检查缓冲区大小,因此如果您声明 char action[10]
,并且您输入一个长度超过 9 个字符的字符串(问:为什么是 9 而不是 10?答:记住NUL 终止符) 会导致缓冲区溢出。
所以你应该做的是使用 scanf("%9s",action)
将输入的字符串的大小限制为 9 个字符。
但实际上,当您只想输入一个字符时,您可以简单地使用字符而不是字符串:
char action; // declare one single char
...
scanf("%c",&action); // use %c instead of %s
...