使用C语言输入和打印静态矩阵

时间:2017-04-16 19:34:08

标签: c function pointers matrix

感谢您的帮助,抱歉我的英语不好 我尝试使用带有函数的矩阵从用户输入或用随机数填充矩阵然后打印它,但我只打印最后一行,我认为问题与指针有关,请帮帮我 用户选择是否要填充矩阵或使用随机数来执行此操作, 这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 25
#define MIN 10

int i, j, y, x, n;
int mat [MAX] [MAX];
int main ()
{   
  int x, y, i, j, user, n;
  printf ("Goodmorning, insert matrix dims (y,x): ");
  scanf ("%d %d",&y,&x);
  for (i=0;i<y;i++)
   for (j=0;j<x;j++)
    mat [i] [j] = 0;
  printf ("\nInsert '0' for random, insert '1' for manual: ");
  scanf ("%d", &user);
  if (!user)
  rand_matrix (mat [x], x, y);
  if (user)
  input_matrix (mat [x], x, y);
  stampa_matrix (mat  [x], x, y);
  return 0;
}

  rand_matrix (int matrix  [y] [x] , int b, int a)
 {
 srand(time(NULL));
 for (i=0;i<a;i++)
 for (j=0;j<b;j++)
  {
   n = rand () % MAX + MIN;
   matrix [i] [j] = n;
  }
 }

input_matrix (int matrix [y] [x], int b, int a)
{
for (i=0;i<a;i++)
 for (j=0;j<b;j++)
 scanf ("%d", &matrix[i] [j]);
}

stampa_matrix (int matrix [y] [x] , int b, int a)
{
 for (i=0;i<a;i++) 
 {
  printf ("\n");
  for (j=0;j<b;j++)
  printf ("%3d ", matrix [i] [j] );
 }
}

2 个答案:

答案 0 :(得分:1)

我认为我的代码存在各种问题。我将在下面详细说明:

1)您正在main()中定义函数调用的函数(rand_matrix,input_matrix,stampa_matrix)。这可能在gcc中编译正常但在VC中失败。功能原型设计也是一个好主意。

2)所有三个函数都没有返回类型(已经不推荐使用隐式int;请参考这个 - C function calls: Understanding the "implicit int" rule

3)正如mab所指出的,你需要在声明中使用双指针,如下所示: 空虚 rand_matrix(int matrix[][MAX], int b, int a) 要么 void rand_matrix(int matrix[MAX][MAX], int b, int a)

4)函数调用应如下所示: rand_matrix(mat, x, y);而非rand_matrix (mat [x], x, y); 在第一次调用中,您传递第0行的地址,而第二次传递第x行的地址,其中x是行本身导致访问边界违规(记住数组元素从索引0开始)

最后,请按照代码缩进进行正确理解。祝你好运!

答案 1 :(得分:-2)

在代码中,matint mat[MAX][MAX];声明为指向整数的指针。因此,声明中的每个后缀[MAX]都会在底层C数据类型中添加另一个指针。

引用对象时,例如通过mat[i][j] = 3,类似的事情发生了。每个后缀[i]解析一个指向底层C数据类型的指针。删除指针的所有图层后,实际上可以访问该存储位置的int

代码中函数input_matrix()stampa_matrix()的参数是mat[x]。那将是一个指向int数据类型的指针。

但是,matrix[i][j]在函数中删除了两层指针。因此,mat的声明数据类型与函数input_matrix()stampa_matrix()中的实际使用之间存在不匹配。

要解决此问题,请按以下方式提供mat参数:

/* ... */
if(user)
    input_matrix(mat, x, y);

stampa_matrix(mat, x, y);
/* ... */

所以现在你将一个指向指针的指针传递给函数int。在函数中,您可以通过matrix[i][j]正确地解析指向指针的位置,并访问实际的int

在函数的声明中,方括号中的xy不是必需的。此外,最好在函数名称前面添加返回数据类型(此处为:void)。

void input_matrix (int matrix[][], int b, int a)
{
    /* ... */
}

void stampa_matrix (int matrix[][] , int b, int a)
{
    /* ... */
}

在函数参数列表中,重要的是它们的数据类型。同样int matrix[][]表示在此上下文中指针指向int

代码中还有另一件事让我感到震惊:

缩进不一致,部分只有1个空格。我建议使用4个空格或1个标签以获得清晰的视野。如果这导致线路剩余长度出现问题,则表明代码应分成不同的文件或模块。

在早期采用一致的风格是一种好习惯。然后,后续的代码维护就容易多了。