C中的动态二维数组不读取第一个元素

guben

我的大学要求我编写一个程序来读取输入并将其存储到动态 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

numpy索引:二维数组中每行的第一个(可变)元素数

C:二维数组的大小 - 指针和第一个元素之间的差异

添加第一个元素相同的二维数组的元素

二维数组名称第一个元素

JS返回已排序的二维数组的第一个元素

通过指向第一个元素的指针访问二维数组

在二维数组(网格)中设置第一个数组的第一个元素在每个内部数组中设置第一个元素

C二维数组:第一个“级别”是指针数组吗?

Python如何获取二维列表中的每个第一个元素

如何在二维数组中的第一个循环之后打印

二维数组打印每行的第一个负数和最后一个之间的元素总和

获取标题部分的二维数组中每个元素的第一个字母并调整标题高度

二维String数组跳过第一个值

将第一个二维数组与所有其他列配对

读取数组中的第一个元素

将二维数组的元素复制到另一个二维数组中

创建一个二维数组,第一个数字为行数

来自C#中BinaryReader的Readstring不读取第一个字节

javascript:使用第一个“行”将二维数组转换为对象数组以定义属性

如何在二维数组ruby中打印子数组的最后一个元素

如何按第一个和第二个索引对 C++ 中的二维向量进行排序?

从字典中的二维数组中的每个元素中减去一个值

在 C 中创建一个函数来检查二维数组中是否有相邻的相等元素

指向C中数组的第一个元素

如何删除二维数组中的最后一个元素?

爪哇。显示二维数组中的一个元素

为什么fgets()在第一个元素之后不读取?

c ++函数创建一个二维数组并返回一个指向二维数组的指针

使用第一个维度将所有二维数组值传递给另一个数组