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