簡體   English   中英

C中的動態2D數組不讀取第一個元素

[英]Dynamic 2D array in C not reading first element

我的大學要求我編寫一個程序,該程序讀取輸入並將其存儲到動態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) { 

read() in會在read_line()看到它之前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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM