运行-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
...