讀古今文學網 > C語言解惑 > 9.3 使用結構數組和指針容易出現的錯誤 >

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