【问题标题】:How access all members in a 2D array of structures when it is passed to a function?将二维结构数组传递给函数时如何访问所有成员?
【发布时间】:2019-01-12 14:21:04
【问题描述】:
#include<stdio.h>
#include<string.h>

struct name
{
  char a[20];
  double s;
};
void print(struct name v[][10],int row,int col)
{ 
    int i,j;
    for( i = 0; i < row; i++)
    {
        for(j = 0; j < col; j++){
            printf("%lf\n ",v[i][j].s );
        }
    }
}

int main()
{
  int m,n,i,j;
  scanf("%d %d",&m,&n);
  struct name v[m][n];
  for(i=0;i<m;i++)
    for(j=0;j<n;j++)
     scanf("%s %lf\n",v[i][j].a,&v[i][j].s);
  print(v,m,n);
   return 0;   
}

在上面的程序中,我想打印二维结构数组 (v) 中的所有成员,但我无法打印第一行以外的元素(剩余的行元素打印为 0)。 谁能帮助如何打印第一行以外的成员?

【问题讨论】:

  • 为什么是“魔法”10
  • 大括号对我们来说是个好主意。同时检查scanf的返回值
  • 术语:你有一个 2D array 结构,而不是“2D 结构”。
  • 为了便于阅读和理解:1) 一致地缩进代码。建议每个缩进级别为 4 个空格。 2) 遵循公理:每行只有一个语句,并且(最多)每条语句有 1 个变量声明。
  • 关于:scanf("%s %lf\n",v[i][j].a,&amp;v[i][j].s); 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功。 2) 当使用输入格式说明符 '%s' 和/或 '[..]' 时,总是包含一个比输入缓冲区长度小 1 的 MAX CHARACTERS 修饰符,以避免任何可能的缓冲区溢出和由此产生的未定义行为

标签: c function multidimensional-array structure


【解决方案1】:

问题是由于您在print 函数中声明参数的方式:

void print(struct name v[][10],int row,int col)
                        ^^^^^^

由于最内层维度10,在print() 函数中,v 将被视为列数为 10 的二维数组,当您尝试打印它时,您将无法获得预期的输出如果col 的值不是10。只需尝试一次,将值10 赋予n 并检查程序的输出,您将获得预期的输出。

为了解决这个问题,改变print()函数参数的顺序,将10替换为col

void print(int row, int col, struct name v[][col])

这样称呼

print(m, n, v);

另外,\nscanf() 格式字符串中不是必需的:

scanf("%s %lf\n",v[i][j].a,&v[i][j].s);
             ^^

删除它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 2017-03-19
  • 2014-05-28
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
相关资源
最近更新 更多