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