运行-Time Check Failure #2 - Stack around variable
Run-Time Check Failure #2 - Stack around variable
我有下一个错误代码 -"运行-Time Check Failure #2 - Stack around the variable 'action' was corrupted."
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;
}
可能是什么问题?
我尝试初始化 'action' 并仅扫描字符,但一切都不是正确的解决方案,我仍然遇到异常。
"运行-Time Check Failure #2 - 变量 'action' 周围的堆栈已损坏。"通常发生在缓冲区溢出之后。
首先:char action[1]
:这个变量可以容纳最大长度为0的字符串,是的,你已经读懂了。在 C 中,字符串以 NUL 结尾(详细信息在初学者 C 教科书的字符串章节中)。因此,如果您输入任何长度超过 0 个字符的字符串,action
缓冲区就会溢出,因此会出现错误消息。
其次:scanf("%s", action)
没有检查缓冲区大小,所以如果您声明 char action[10]
,并且您输入的字符串长度超过 9 个字符(问:为什么是 9 个而不是 10 个?A : 记住 NUL 终止符)你得到缓冲区溢出。
所以你应该做的是使用 scanf("%9s", action)
这会将输入的字符串的大小限制为 9 个字符。
但实际上因为你只想输入 一个 字符你可以简单地使用字符而不是字符串:
char action; // declare one single char
...
scanf("%c", &action); // use %c instead of %s
...
我有下一个错误代码 -"运行-Time Check Failure #2 - Stack around the variable 'action' was corrupted."
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;
}
可能是什么问题?
我尝试初始化 'action' 并仅扫描字符,但一切都不是正确的解决方案,我仍然遇到异常。
"运行-Time Check Failure #2 - 变量 'action' 周围的堆栈已损坏。"通常发生在缓冲区溢出之后。
首先:char action[1]
:这个变量可以容纳最大长度为0的字符串,是的,你已经读懂了。在 C 中,字符串以 NUL 结尾(详细信息在初学者 C 教科书的字符串章节中)。因此,如果您输入任何长度超过 0 个字符的字符串,action
缓冲区就会溢出,因此会出现错误消息。
其次:scanf("%s", action)
没有检查缓冲区大小,所以如果您声明 char action[10]
,并且您输入的字符串长度超过 9 个字符(问:为什么是 9 个而不是 10 个?A : 记住 NUL 终止符)你得到缓冲区溢出。
所以你应该做的是使用 scanf("%9s", action)
这会将输入的字符串的大小限制为 9 个字符。
但实际上因为你只想输入 一个 字符你可以简单地使用字符而不是字符串:
char action; // declare one single char
...
scanf("%c", &action); // use %c instead of %s
...