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