在C中读取二维矩阵时检测到错误的大小

时间:2014-09-12 18:03:59

标签: c arrays input

从C中的文件读取矩阵时我遇到了一些问题。我的代码首先读取矩阵的大小N,然后为正确的整数矩阵分配内存并读取要放入其中的元素。

如果输入文件的矩阵大小合适,一切正常。但是如果有一个元素少,代码将无法完成循环。我尝试了一个测试来检查元素是不是'\ n'还是EOF,但它不起作用。

以下是代码:

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

void trashout();
int ** alocamatrix(int N);
void readmatrix(int **matrix, int N);
void printmatrix(int **matrix, int N);

int main() {

  int N, **matrix;

  scanf("%d", &N);
  printf("N = %d\n", N);
  if(N > 20 || N < 1){
    printf("ERROR: invalid data\n");
    exit (0);
  }
  trashout();

  matrix = alocamatrix(N);

  readmatrix(matrix, N);
  printmatrix(matrix, N);


  return 0;
}

void trashout(){ 
  char trash = 'a';
  while (trash != '\n' && trash != EOF){
    scanf("%c", &trash);
    if(trash == EOF){
      printf("ERROR: invalid data\n");
      exit (0);
    }
  }
}

int ** alocamatrix(int N){
  int i, **matrix;
  matrix = malloc(N * sizeof(int *));
  for(i = 0; i < N; i++)
    matrix[i] = malloc(N * sizeof(int));

  return matrix;
}

void readmatrix(int **matrix, int N){
  int i, j; 
  char garb = 'a';

  for(i = 0; i < N; i++){
    for(j = 0; j < N; j++){
      scanf("%d", &matrix[i][j]);
      if(matrix[i][j] == EOF || matrix[i][j] == '\n' ){
    printf("Dados inválidos\n");
    exit (0);
      }
    }
    trashout(garb);
  }

}

void printmatrix(int **matrix, int N){
  int i, j;
  for(i = 0; i < N; i++){
    for(j = 0; j < N; j++){
      printf("%d ", matrix[i][j]);
    }
    printf("\n");
  }
}

下面有两个输入文件,06_B将在07不工作。

https://drive.google.com/file/d/0ByeiEVRxD2mwRFRlcXkwc0traW8/edit?usp=sharing https://drive.google.com/file/d/0ByeiEVRxD2mweFp6WWx0V2hPT00/edit?usp=sharing

运行此程序的正确方法是

./program < arq06_B.in

./program < arq07.in

2 个答案:

答案 0 :(得分:1)

在您的代码中,行

scanf("%d", &matrix[i][j]);

将ASCII(例如 42)作为int读取,并将其存储在matrix[i][j]中。

它不会“检测”EOF\n作为有效的%d格式,因此它根本不会检索或存储任何内容。

您可以检查the return value of scanf是否小于或等于零,以检测它是否无法读取另一个整数。

答案 1 :(得分:1)

此while循环将继续,直到它无法读取整数或i超过N.

void readmatrix(int **matrix, int N){
    int i, j;             

    i = 0;                                    
    j = 0;                                    
    while ( scanf("%d", &matrix[i][j]) == 1) {
        j++;                                  
        if ( j >= N) {    
            j = 0;        
            i++;          
        }                 
        if ( i >= N) {    
            break;        
        }
        if ( feof ( stdin)) {
            break;
        }                 
    }                     
}