c - 运行时检查失败 #2 - 围绕变量堆栈
问题描述
我有下一个带有错误的代码 - “运行时检查失败 #2 - 变量‘操作’周围的堆栈已损坏。”
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 而不是字符串:
char action; // declare one single char
...
scanf("%c", &action); // use %c instead of %s
...
推荐阅读
- typescript - SonarQube 无法识别打字稿
- c++ - 系统程序的 TDD
- angular - AfterViewInit 中的属性绑定不影响视图
- ansible - 使用 Ansible 显示 MQ 侦听器状态不工作
- java - 您是否必须在超类中有一个抽象方法才能启用后期绑定
- javascript - React - 在卸载时滑出组件
- javascript - 从 draggable.js 函数内的 onClick 回调中排除元素
- java - 如何使用 .bat 文件运行 jar 文件及其多个外部属性文件?
- alert - Tradingview:当动量线从绿色变为红色时,警报不起作用。当设置为 15 分钟时间范围时,它每 15 分钟提醒一次:Tradingview
- node.js - Angular RxJs TypeError“未定义”