带有用户输入的二维数组

Two Dimensional Arrays with User Input

我正在制作填字游戏网格,用户首先输入网格的尺寸,然后每行由 space 分隔或回车。该程序接受每一行并将该行的每个字母放在网格 [][] 上的一个点上。到目前为止,我只设法使我的网格适用于 4x4 或更小的尺寸,如果我把它做得更大,在 grid[0][i] 中找到的任何字母都会吐出垃圾。如果我在循环的每次迭代后打印网格它是正确的,但如果我返回并检查它不是。有人有什么想法吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (){

    int i, j, row, column;

    scanf("%i", &row);
    scanf("%i", &column);

    char *userInput = malloc (sizeof(char)*column);
    char **grid = malloc(sizeof(char)*column);

    for(i=0; i<row; i++){
        scanf("%s", userInput);
        grid[i] = (char*) malloc (row *sizeof(char));
        for (j=0; j<column; j++){
            grid[i][j] = userInput[j];
        }
    }

    // double check to see if the grid is correct.
    printf("%c", grid[0][2]);

return 0;
}

我认为你在混合索引

  • 你分配 column 数量的 char* 指针
  • 然后你迭代row(当它应该是column)并为每个索引
  • 分配row数量的char
  • 然后用长度为 column 的字符串填充 char[row] 而不是 row

因为你正在阅读 column 个字符,我假设你想要一个行 x 列矩阵,你应该做的是

int i, j, row, columnM
char** grid = malloc(row*sizeof(char*));
char* userInput = malloc(column);

for (i = 0; i < row; ++i)
{
  grid[i] = malloc(column);
  ..
  memcpy(grid[i], userInput, column);
}

实际上您不需要 sizeof(char) 分配,因为标准保证 char 为 1 个字节。

请注意 scanf 将在读取的字符串末尾写一个 nul 终止符,而不管缓冲区的大小。所以你应该至少提供 column+1 字节来读取。这不会阻止用户输入更多字符并导致缓冲区溢出,请查看我的评论。

您的网格 malloc 不正确。应该是

char **grid = malloc(sizeof(char*)*column);

网格是 "pointer to char" 而非 "char" 的数组。看到垃圾是缓冲区溢出(或在本例中为缓冲区分配不足)的典型症状。

此外,虽然如果您小心的话,严格来说 没有必要,但所有字符缓冲区都应该分配一个额外的字节用于字符串终止符(零)。