我的大学要求我编写一个程序来读取输入并将其存储到动态 2D 数组中,但我们还没有涉及到这个主题。我的实现遇到了问题,因为它跳过了每行中的第一个字符。我知道代码质量不高,但我不明白为什么它跳过第一个字符。
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define MULT 3
#define DIV 2
char *read_line(int *col_size, int *max_c) {
char *line = NULL;
int size = *col_size;
int i, c;
line = malloc(size * sizeof *line);
for (i = 0; ((c = getchar()) != '\n') && (c != EOF); ++i) {
if (i == size) {
size = 1 + size * MULT / DIV;
line = realloc(line, size * sizeof *line);
assert(line != NULL);
}
line[i] = c;
}
if (i > *max_c)
*max_c = i;
if (size > *col_size)
*col_size = size;
return line;
}
char **read(int *row, int *col) {
char **input = NULL;
int row_size = 0;
int col_size = 0;
int i, c;
int max_c = 0;
for (i = 0; (c = getchar()) != EOF; ++i) {
if (i == row_size) {
row_size = 1 + row_size * MULT / DIV;
input = realloc(input, row_size * sizeof *input);
assert(input != NULL);
}
input[i] = read_line(&col_size, &max_c);
}
*row = i;
*col = max_c;
return input;
}
int main(void) {
int row_size, col_size, i, j;
char **board = read(&row_size, &col_size);
for (i = 0; i < row_size; ++i) {
for (j = 0; j < col_size; ++j)
putchar(board[i][j]);
putchar('\n');
}
free(board);
return 0;
}
for (i = 0; (c = getchar()) != EOF; ++i) {
inread()
吃掉一行的第一个字符,然后read_line()
才能看到它。您必须找到其他方法来检查EOF
. 例如与
for (i = 0; !feof(stdin); ++i) {
此外,您不会以零结尾您的字符串。改变你的阅读循环
char *read_line(int *col_size, int *max_c) {
int size = *col_size ? *col_size : 1; // at least 1 for the terminating 0
char *line = malloc(size * sizeof *line);
if(!line)
return NULL;
int i, c;
for (i = 0; ((c = getchar()) != '\n') && (c != EOF); ++i) {
if(i == size) {
size = 2 + size * MULT / DIV; // note the 2
// ...
}
// ...
}
line[i] = '\0';
这样做。
for (i = 0; i < row_size; ++i) { for (j = 0; j < col_size; ++j) putchar(board[i][j]); // accesses memory that isn't yours putchar('\n'); // if not all rows are of the same length. }
为避免读取内存越界,请将其更改为
for (i = 0; i < row_size; ++i) {
for (j = 0; board[i][j] != '\0'; ++j)
putchar(board[i][j]);
putchar('\n');
}
因为您现在拥有以零结尾的字符串。或者为什么不直接使用puts()
?
for (i = 0; i < row_size; ++i)
puts(board[i]);
free(board);
这不会释放您为行分配的内存。你必须
for (i = 0; i < row_size; ++i)
free(bard[i]);
free(board);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句