我正在制作填字游戏网格,用户首先输入网格的尺寸,然后用空格或输入分隔每一行。程序接收每一行并将该行的每个字母放在网格[] []上的一个点上。到目前为止,我只设法使我的网格工作为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;
}
答案 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”的数组。查看垃圾是缓冲区溢出的典型症状(或者在这种情况下,缓冲区分配不足)。
另外,如果你小心,不要严格,所有字符缓冲区应该为字符串终结符(零)分配额外的字节。