如何解决运行时检查失败 #2 - 围绕变量堆栈
我有下一个错误代码 -“运行时检查失败 #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
...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。