Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用户输入的二维数组_C_Arrays_Malloc - Fatal编程技术网

C 用户输入的二维数组

C 用户输入的二维数组,c,arrays,malloc,C,Arrays,Malloc,我正在制作一个纵横字谜网格,用户首先输入网格的尺寸,然后用空格或enter分隔每条线。程序接收每一行,并将该行的每个字母放在网格[]上的一个点上。到目前为止,我只设法使我的网格工作的维度为4x4或更小,如果我使它更大,那么在网格[0][I]中找到的任何字母都会吐出垃圾。如果我在循环的每次迭代后打印网格,它是正确的,但是如果我返回并检查它不是。有人有什么想法吗 #include <stdio.h> #include <stdlib.h> #include <strin

我正在制作一个纵横字谜网格,用户首先输入网格的尺寸,然后用空格或enter分隔每条线。程序接收每一行,并将该行的每个字母放在网格[]上的一个点上。到目前为止,我只设法使我的网格工作的维度为4x4或更小,如果我使它更大,那么在网格[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;
}
#包括
#包括
#包括
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也超出了范围。