映月读书网 > C语言解惑 > 9.3 使用结构数组和指针容易出现的错误 >

9.3 使用结构数组和指针容易出现的错误

【例9.10】改正如下程序中的错误。


#include <stdio.h>
typedef struct student {
             char name[10]
;
             int studnem
;
}STUDNT
;
void disp
(STUDNT [ ] 
);
int main
( 
)
{
  int i
;
  STUDNT a[3]
;
  for
(i=0
;i<3
;i++
)
  {
      printf
("
输入姓名和学号:"
);
      scanf
("%s%d"
, &a[i].name
,&a[i].studnem
);
  }
  disp
(a
);
  return 0
;
}
void disp
(STUDNT a
)
{
     int i
;
     char st[ ][8]={"
姓名:"
,"
学号:"}
;
     for
(i=0
;i<3
;i++
)
         printf
("%s%s %s%d\n"
,st[0]
,a[i].name
,st[1]
,a[i].studnem
);
}
  

【解答】由于结构被使用typedef方式定义,所以函数原型声明中只能给出数据类型。使用语句


void disp
(STUENT a[3]
);
  

的显示方式声明也不行。正确的声明如下。


void disp
(STUENT 
);
  

或者使用原来的形式,即


void disp
(struct student [ ]
);
  

至于scanf语句,因为name是字符串,所以不需要冠以&,但student必须使用&符号。

运行示范如下。


输入姓名和学号:张歆艺 1201
输入姓名和学号:吴闲人 1204
输入姓名和学号:梅玉海 1205
姓名:张歆艺 
学号:1201
姓名:吴闲人 
学号:1204
姓名:梅玉海 
学号:1205
  

【例9.11】改正使用指针出现的错误。


#include <stdio.h>
typedef struct student {
            char name[10]
;
            int studnem
;
}STUDNT
;
void disp
(STUDNT 
);
int main
()
{
    int i
;
    STUDNT a[3]
,*p=a
;
    for
(i=0
;i<3
;i++
)
    {
           printf
("
输入姓名和学号:"
);
           scanf
("%s%d"
, &p->name
,&p->studnem
);
    }
    disp
(a
);
    return 0
;
}
void disp
(STUDNT a
)
{
    int i
;
    char st[8]={"
姓名:"
,"
学号:"}
;
    for
(i=0
;i<3
;i++
)
           printf
("%s%s %s%d\n"
,st[0]
,a[i].name
,st[1]
,a[i].studnem
);
}
  

【解答】指针没有随输入移动,所以只保存最后输入的信息。需要在for语句中将指针随i同步变化,即


for
(i=0
;i<3
;i++
,p++
)
  

最简单的是不改变for语句而改变scanf语句。下面4种格式都是正确的,任选一个即可,这些使用偏移量的方法的好处是不改变p的值。


scanf
("%s%d"
, p[i].name
,&p[i].studnem
);
scanf
("%s%d"
, &p[i].name
,&p[i].studnem
);
scanf
("%s%d"
, 
(p+i
)->name
,&
(p+i
)->studnem
);
scanf
("%s%d"
, &
(p+i
)->name
,&
(p+i
)->studnem
);