打印矩阵错误

时间:2015-05-27 02:04:59

标签: c

我创建了一个程序,从另一个文件中读取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

2 个答案:

答案 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越界。

您可以通过

解决此问题
  1. 使用动态内存分配或
  2. 在读取matrix的值之后移动linecount的定义。
  3. 我的建议是使用动态内存分配。

    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