我正在尝试编写用于读取矩阵读取器的代码,该读取器将从重定向文件读取矩阵(因此我的程序中不会使用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);
问题
while(ch != EOF)
或while(c=getchar() != EOF)
是否意味着它没有点击LINE的结尾或FILE的结尾?上面显示的版本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");
}
}
答案 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;
}