C将矩阵读入动态数组

时间:2014-04-07 15:12:46

标签: c arrays dynamic matrix malloc

我正在尝试编写用于读取矩阵读取器的代码,该读取器将从重定向文件读取矩阵(因此我的程序中不会使用FILE函数),将其存储在动态创建的数组中,然后打印到控制台

重要提示 数组是动态的(意味着通过读取整个文件并计算行数和列数来获得维度。

我尝试过编写代码2以不同的方式执行此操作,这两种方法都会导致输出错误:

版本A:

while(ch != EOF) {
  ch = fgetc(stdin);

  if(ch == ' ') {
    fields++;
  }
  if(ch == '\n') {
    rows++;
  }

}

版本B:

do {
  c=getchar();

  if(c == ' '){
    fields++;
  }

} while (c != EOF); 

问题

  1. while(ch != EOF)while(c=getchar() != EOF)是否意味着它没有点击LINE的结尾或FILE的结尾?
  2. 上面显示的版本B运气不好。在测试文件上使用时:

    10 20 30 40
    50 60 70 80
    90 10 20 30
    40 50 60 70
    

    我得到输出:

    50 60 70 80
    90 10 20 30
    40 50 60 70
    70 70 70 70
    

    我认为我在这里遇到的问题是,每当我在读取文件时,一旦它到达EOF,它就会突破循环,然后它就在文件的第二行,这就是为什么输出从第二行开始行,然后复制最后一个数字X次以填充矩阵的其余部分。

    我的目标是否可以通过我目前的方法实现? 这是我的所有代码,谢谢。

    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
      int rows=0;
      int fields=1;
      int i=0;
      int j=0;
      int c=0;
      char ch = '\0';
    
    /*  while(ch != EOF) {
        ch = fgetc(stdin);
        if(ch == ' ') {
          fields++;
        }
        if(ch == '\n') {
          rows++;
        }
      } */
    
       do {
        c=getchar();
        if(c == ' '){
          fields++;
        }
    
      } while (c != 10);
    
    
      int **array;
      array = malloc(fields * sizeof(int *));
    
      if(array == NULL) {
        printf("Out of memory\n");
        exit(1);
      }
    
      for(i = 0; i < fields; i++) {
        array[i] = malloc(fields * sizeof(int));
        if(array[i] == NULL) {
          printf("Out of memory\n");
          exit(1);
        }
    
      }
    
      for(i = 0; i < fields; i++) {
        for(j = 0; j < 4; j++) {
          int k;
          scanf("%d", &k);
          array[i][j] = k;
          printf("%d ", k);
        }
        printf("\n");
      }
    } 
    

1 个答案:

答案 0 :(得分:1)

#include <stdio.h>
#include <stdlib.h>

int main(){
    int rows = 0;
    int cols = 0;
    int fields = 0;
    int i, j, c, n, status;;
    int **array;
    char ch;

    array = malloc((rows+1) * sizeof(int*));//check omit
    array[rows] = NULL;

    while(0<(status = scanf("%d%c", &n, &ch))){
        if(status>1){
            if(cols == fields){
                array[rows] = realloc(array[rows], (fields=cols+1)*sizeof(int));
            }
            array[rows][cols++] = n;
            if (ch == '\n'){
                array = realloc(array, (++rows+1) * sizeof(int*));
                array[rows] = malloc(fields*sizeof(int));
                cols = 0;
            }
        } else {
            array[rows][cols++] = n;
            break;
        }
    }
    if(cols == 0){
        free(array[rows--]);
    }
    for(i=0;i<=rows;++i){
        for(j=0;j<fields;++j){
            printf("%d ", array[i][j]);
        }
        printf("\n");
        free(array[i]);
    }
    free(array);
    return 0;
}