带有用户输入的二维数组
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" 的数组。看到垃圾是缓冲区溢出(或在本例中为缓冲区分配不足)的典型症状。
此外,虽然如果您小心的话,严格来说 没有必要,但所有字符缓冲区都应该分配一个额外的字节用于字符串终止符(零)。
我正在制作填字游戏网格,用户首先输入网格的尺寸,然后每行由 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
)并为每个索引 分配 - 然后用长度为
column
的字符串填充char[row]
而不是row
row
数量的char
因为你正在阅读 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" 的数组。看到垃圾是缓冲区溢出(或在本例中为缓冲区分配不足)的典型症状。
此外,虽然如果您小心的话,严格来说 没有必要,但所有字符缓冲区都应该分配一个额外的字节用于字符串终止符(零)。