所以我试图制作一个矩阵阅读器,它将采用仅包含NxN矩阵数据的文本文件,例如:
10 9 8 7
6 5 4 3
2 1 0 1
将测试文件读入动态多维数组。程序没有标题,因此需要读取整个文件才能获得行数/列数。
一旦我拥有了数组中的所有数据,我就可以操作我想要的方式(即交换列/行,颠倒顺序等)。
此时我只是试图让我的程序只需输出整个矩阵读入后在测试文件中出现的数组。
这是我到目前为止所写的内容:
#include <stdio.h>
#include <stdlib.h>
int main() {
int n;
int i=0;
int j=0;
scanf("%d", &n);
int **array;
array = malloc(n * sizeof(int *));
if(array == NULL) {
printf("Out of memory\n");
exit(1);
}
for(i = 0; i < n; i++) {
array[i] = malloc(n * sizeof(int));
if(array[i] == NULL) {
printf("Out of memory\n");
exit(1);
}
}
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
int k;
scanf("%d", &k);
array[i][j] = k;
printf("%d ", array[i][j]);
}
}
}
运行这个给我输出:
9 8 7 6 5 4 3 2 1 0 1 1 1 1 1 1 1 1 1 1 1 1... repeating 1's...
我不确定我的代码出了什么问题我已经盯着它看了一个小时并取得了一些进展。
因为我的输出打印出大约100个不同的int,我觉得我的问题在于我的打印循环,我觉得它与int n有关,但我不知道如何处理这个问题。
非常感谢任何帮助!感谢。
答案 0 :(得分:1)
问题如下:从您的文件中获取的第一个数字是10
,并且存储在int n
靠近开头的内部。该值定义了多维数组的宽度和高度,矩阵。然后,您要求该文件中的其他值多次10 * 10
。
但是,该文件中只剩下4 * 3 - 1 = 11
个数字。它将所有内容提供给int k
。这些值存储在矩阵内,打印出来。在第11次(或第12次,如果你计算第一次10
)后,scanf
开始失败。失败时,它会返回值EOF == -1
,但您无法识别。
失败使k
保持原样,虽然我不确定它是否保证保持原来的状态,因为据我所知,k
很可能有另一个内存位置每个循环都为自己分配,因为(据我所知)它在每个循环结束时被清除。在你的情况下,它确实保留了它的价值,幸运的是我会说,并且存储/打印。
最后,你应该打印100个数字,因为最开始是10
。
即使您在一开始就有一个额外的4
,您最终会得到一个矩阵,该矩阵的最后一行包含所有1
个。
如果您想拥有一个3乘4的矩阵,请考虑将您的文件设为以下示例:
3 4
10 9 8 7
6 5 4 3
2 1 0 1
然后将第一个值读入int n
,然后将第二个值读入int m
。使用malloc( n * sizeof * array );
进行第一次内存分配,然后使用malloc( m * sizeof ** array );
进行二次分配。
您也可以省略读取任何内容,通过读取文件中新行'\n'
次出现的数量(加一)来推断出矩阵应该有多少行和列,以及那里的数字量在一条线上。
好的,让我们展示一下你也可以部分:这只是一个例子,我将使用一对scanf
来计算两者内部至少有一个数字和一行数字的行数。
...
int n = 0;
int m = 0;
int discardable;
while ( scanf( "%d", &discardable ) == 1 ) {
// as long as a number has been successfully read
n++;
if ( scanf( "%*[^\n]" ) != 0 )
// discard everything until a '\n'
// and if you fail to encounter a '\n' anywhere until the file ends...
break;
}
// rewind back to the beginning of the file
rewind ( stdin );
while ( scanf( "%d", &discardable ) == 1 ) {
// as long as a number has been successfully read
m++;
if ( scanf( "%*[ \t]" ) != 0 || stdin->_ptr[0] == '\n' )
// discard every ' ' or '\t'
// if you rather get carried until the end of file, break
// else, if the upcoming character is '\n', again, break
break;
}
rewind ( stdin );
...
你有它,n
和m
这里应该分别存储你应该拥有的矩阵的高度和宽度。
这只是一种方法,我可以看到为什么许多人可能只是讨厌这个,因为我已经使用了FILE
结构,并提到_ptr
,但无论如何。我个人更喜欢这个,而不是携带临时字符数组并从中读取。