从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
答案 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;
}
}
}