C 用户输入的二维数组
我正在制作一个纵横字谜网格,用户首先输入网格的尺寸,然后用空格或enter分隔每条线。程序接收每一行,并将该行的每个字母放在网格[]上的一个点上。到目前为止,我只设法使我的网格工作的维度为4x4或更小,如果我使它更大,那么在网格[0][I]中找到的任何字母都会吐出垃圾。如果我在循环的每次迭代后打印网格,它是正确的,但是如果我返回并检查它不是。有人有什么想法吗C 用户输入的二维数组,c,arrays,malloc,C,Arrays,Malloc,我正在制作一个纵横字谜网格,用户首先输入网格的尺寸,然后用空格或enter分隔每条线。程序接收每一行,并将该行的每个字母放在网格[]上的一个点上。到目前为止,我只设法使我的网格工作的维度为4x4或更小,如果我使它更大,那么在网格[0][I]中找到的任何字母都会吐出垃圾。如果我在循环的每次迭代后打印网格,它是正确的,但是如果我返回并检查它不是。有人有什么想法吗 #include <stdio.h> #include <stdlib.h> #include <strin
#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;
}
#包括
#包括
#包括
int main(){
int i,j,行,列;
scanf(“%i”行和“&row”);
scanf(“%i”列和列);
char*userInput=malloc(sizeof(char)*列);
char**grid=malloc(sizeof(char)*列);
对于(i=0;i我认为你是在混合指数
- 您分配
列
数量的char*
指针
- 然后迭代
行
(当它应该是列
)并为每个索引分配行
字符量
- 然后用一个长度为
的字符串填充char[row]
,而不是row
由于您正在读取列
字符,我假设您想要一个行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);
}
int i,j,行,列m
字符**网格=malloc(行*sizeof(字符*);
char*userInput=malloc(列);
对于(i=0;i|
实际上,您不需要在分配中使用sizeof(char)
,因为标准保证char为1字节
请注意,scanf
将在读取的字符串末尾写入nul终止符,而与缓冲区大小无关。因此,您应该提供至少列+1
字节来读取。这不会阻止用户输入更多字符并导致缓冲区溢出,请检查我的注释。您的网格malloc不正确。它应该e
char **grid = malloc(sizeof(char*)*column);
网格是一个“指向字符的指针”而不是“字符”的数组。看到垃圾是缓冲区溢出(或者在本例中是缓冲区分配不足)的典型症状
此外,如果小心的话,虽然不是严格必要的,但是所有字符缓冲区都应该为字符串终止符(零)分配一个额外的字节.我已经多年没有使用scanf
,但也许它应该是column+1
用于用户输入?我的意思是-结尾处的空字符…实际上scanf
是不安全的,不应该使用,不管你是否注意所需的nul字符,因为它会写越界。我不会使用它。解决方法是执行类似于scanf(“%8s”,userInput)
的操作来限制字符的数量,然后让column=8+1;
char**grid=malloc(row);
-->char**grid=malloc(row*sizeof(*grid))当代码运行为5x5网格时,我仍然会得到垃圾:/NVM我得到了它的诀窍。有人介意解释它对我有什么影响吗?我的网格必须保持300×300,它也能保存它吗?我把你的问题标记为<代码> C <代码>——因为它是用纯C编写的,但也可以考虑C++(Maulc)(sichof(char)*列)。;不足以容纳一串“column”字符,0-terminator还需要一个字符。此外,您的scanf my也超出了范围。