我创建了一个程序,从另一个文件中读取3行和10列浮点数。然后该程序应该将所有30个值打印到屏幕上,而只打印底部列10次。
我在想我的fscanf循环一定有问题,但我不确定它可能是什么。
主程序:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *read_tank;
int linecount = 0;
float matrix[3][linecount];
float width, height, depth;
int i, j;
read_tank = fopen("tanks.dat", "r");
if (read_tank != NULL)
{
fscanf(read_tank, "%d", &linecount);
for (i = 0; i < linecount; i++)
{
fscanf(read_tank, "%f %f %f", &matrix[i][0], &matrix[i][1], &matrix[i][2]);
}
}
else
{
printf("Open file error\n");
}
printf("+------------------------------------------+\n");
for (i = 0; i < linecount; i++)
{
for (j = 0; j < 3; j++)
{
printf("%3f\t", matrix[i][j]);
}
printf("\n");
}
printf("+------------------------------------------+\n");
fclose(read_tank);
system("pause");
return (0);
}
文件tanks.dat
10
2.0 2.0 1.0
3.0 1.5 0.5
2.5 1.0 0.5
1.0 1.0 0.25
0.5 0.25 0.25
5.0 1.2 1.3
2.5 1.1 0.6
0.8 0.8 0.7
0.8 0.7 0.6
0.5 0.3 0.1
答案 0 :(得分:1)
我相信你的矩阵应该定义如下:
int linecount = 10;
float matrix[linecount][3];
答案 1 :(得分:1)
我看到的问题:
用于声明matrix
int linecount = 0;
float matrix[3][linecount];
这些行相当于:
float matrix[3][0];
允许用户稍后在代码中提供linecount
的值不会更改matrix
的维度。
您的代码显示未定义的行为,因为您正在访问matrix
越界。
您可以通过
解决此问题matrix
的值之后移动linecount
的定义。我的建议是使用动态内存分配。
int linecount = 0;
float* matrix[3] = {0};
float width, height, depth;
int i, j;
read_tank = fopen("tanks.dat", "r");
if (read_tank != NULL)
{
fscanf(read_tank, "%d", &linecount);
for ( i = 0; i < 3; ++i )
{
matrix[i] = malloc(linecount*sizeof(*matrix[0]));
}
请记住在程序结束前使用以下内容释放内存:
for ( i = 0; i < 3; ++i )
{
free(matrix[i]);
}
将用于读取数据的索引修复为matrix
而不是
fscanf(read_tank, "%f %f %f",
&matrix[i][0], &matrix[i][1], &matrix[i][2]);
使用
fscanf(read_tank, "%f %f %f",
&matrix[0][i], &matrix[1][i], &matrix[2][i]);
// ^^^^ 0 and i need to be switched
// as do 1 and i, and 2 and i
修复用于打印matrix
而不是
printf("%3f\t", matrix[i][j]);
使用
printf("%3f\t", matrix[j][i]);
// ^^^^^ j and i need to be switched