具有用户输入的二维数组

时间:2015-09-18 21:15:42

标签: c arrays malloc

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

#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;
}

2 个答案:

答案 0 :(得分:2)

我认为你正在混合指数

  • 您分配column数量的char*指针
  • 然后您在row上进行迭代(当它应为column时)并为每个索引分配row数量的char
  • 然后您使用char[row]长度的字符串填充column,而不是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),因为标准符号保证为1字节。

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

答案 1 :(得分:0)

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

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

Grid是“指向char的指针”而不是“char”的数组。查看垃圾是缓冲区溢出的典型症状(或者在这种情况下,缓冲区分配不足)。

另外,如果你小心,不要严格,所有字符缓冲区应该为字符串终结符(零)分配额外的字节。