首页 » C语言解惑 » C语言解惑全文在线阅读

《C语言解惑》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);