【例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
);